//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension OpsWorks {
    // MARK: Enums

    public enum AppAttributesKeys: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case autoBundleOnDeploy = "AutoBundleOnDeploy"
        case awsFlowRubySettings = "AwsFlowRubySettings"
        case documentRoot = "DocumentRoot"
        case railsEnv = "RailsEnv"
        public var description: String { return self.rawValue }
    }

    public enum AppType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `static` = "static"
        case awsFlowRuby = "aws-flow-ruby"
        case java = "java"
        case nodejs = "nodejs"
        case other = "other"
        case php = "php"
        case rails = "rails"
        public var description: String { return self.rawValue }
    }

    public enum Architecture: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case i386 = "i386"
        case x8664 = "x86_64"
        public var description: String { return self.rawValue }
    }

    public enum AutoScalingType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case load = "load"
        case timer = "timer"
        public var description: String { return self.rawValue }
    }

    public enum CloudWatchLogsEncoding: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ascii = "ascii"
        case big5 = "big5"
        case big5hkscs = "big5hkscs"
        case cp037 = "cp037"
        case cp1006 = "cp1006"
        case cp1026 = "cp1026"
        case cp1140 = "cp1140"
        case cp1250 = "cp1250"
        case cp1251 = "cp1251"
        case cp1252 = "cp1252"
        case cp1253 = "cp1253"
        case cp1254 = "cp1254"
        case cp1255 = "cp1255"
        case cp1256 = "cp1256"
        case cp1257 = "cp1257"
        case cp1258 = "cp1258"
        case cp424 = "cp424"
        case cp437 = "cp437"
        case cp500 = "cp500"
        case cp720 = "cp720"
        case cp737 = "cp737"
        case cp775 = "cp775"
        case cp850 = "cp850"
        case cp852 = "cp852"
        case cp855 = "cp855"
        case cp856 = "cp856"
        case cp857 = "cp857"
        case cp858 = "cp858"
        case cp860 = "cp860"
        case cp861 = "cp861"
        case cp862 = "cp862"
        case cp863 = "cp863"
        case cp864 = "cp864"
        case cp865 = "cp865"
        case cp866 = "cp866"
        case cp869 = "cp869"
        case cp874 = "cp874"
        case cp875 = "cp875"
        case cp932 = "cp932"
        case cp949 = "cp949"
        case cp950 = "cp950"
        case eucJis2004 = "euc_jis_2004"
        case eucJisx0213 = "euc_jisx0213"
        case eucJp = "euc_jp"
        case eucKr = "euc_kr"
        case gb18030 = "gb18030"
        case gb2312 = "gb2312"
        case gbk = "gbk"
        case hz = "hz"
        case iso2022Jp = "iso2022_jp"
        case iso2022Jp1 = "iso2022_jp_1"
        case iso2022Jp2 = "iso2022_jp_2"
        case iso2022Jp2004 = "iso2022_jp_2004"
        case iso2022Jp3 = "iso2022_jp_3"
        case iso2022JpExt = "iso2022_jp_ext"
        case iso2022Kr = "iso2022_kr"
        case iso885910 = "iso8859_10"
        case iso885913 = "iso8859_13"
        case iso885914 = "iso8859_14"
        case iso885915 = "iso8859_15"
        case iso885916 = "iso8859_16"
        case iso88592 = "iso8859_2"
        case iso88593 = "iso8859_3"
        case iso88594 = "iso8859_4"
        case iso88595 = "iso8859_5"
        case iso88596 = "iso8859_6"
        case iso88597 = "iso8859_7"
        case iso88598 = "iso8859_8"
        case iso88599 = "iso8859_9"
        case johab = "johab"
        case koi8R = "koi8_r"
        case koi8U = "koi8_u"
        case latin1 = "latin_1"
        case macCyrillic = "mac_cyrillic"
        case macGreek = "mac_greek"
        case macIceland = "mac_iceland"
        case macLatin2 = "mac_latin2"
        case macRoman = "mac_roman"
        case macTurkish = "mac_turkish"
        case ptcp154 = "ptcp154"
        case shiftJis = "shift_jis"
        case shiftJis2004 = "shift_jis_2004"
        case shiftJisx0213 = "shift_jisx0213"
        case utf16 = "utf_16"
        case utf16Be = "utf_16_be"
        case utf16Le = "utf_16_le"
        case utf32 = "utf_32"
        case utf32Be = "utf_32_be"
        case utf32Le = "utf_32_le"
        case utf7 = "utf_7"
        case utf8 = "utf_8"
        case utf8Sig = "utf_8_sig"
        public var description: String { return self.rawValue }
    }

    public enum CloudWatchLogsInitialPosition: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case endOfFile = "end_of_file"
        case startOfFile = "start_of_file"
        public var description: String { return self.rawValue }
    }

    public enum CloudWatchLogsTimeZone: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case local = "LOCAL"
        case utc = "UTC"
        public var description: String { return self.rawValue }
    }

    public enum DeploymentCommandName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case configure = "configure"
        case deploy = "deploy"
        case executeRecipes = "execute_recipes"
        case installDependencies = "install_dependencies"
        case restart = "restart"
        case rollback = "rollback"
        case setup = "setup"
        case start = "start"
        case stop = "stop"
        case undeploy = "undeploy"
        case updateCustomCookbooks = "update_custom_cookbooks"
        case updateDependencies = "update_dependencies"
        public var description: String { return self.rawValue }
    }

    public enum LayerAttributesKeys: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bundlerVersion = "BundlerVersion"
        case ecsClusterArn = "EcsClusterArn"
        case enableHaproxyStats = "EnableHaproxyStats"
        case gangliaPassword = "GangliaPassword"
        case gangliaUrl = "GangliaUrl"
        case gangliaUser = "GangliaUser"
        case haproxyHealthCheckMethod = "HaproxyHealthCheckMethod"
        case haproxyHealthCheckUrl = "HaproxyHealthCheckUrl"
        case haproxyStatsPassword = "HaproxyStatsPassword"
        case haproxyStatsUrl = "HaproxyStatsUrl"
        case haproxyStatsUser = "HaproxyStatsUser"
        case javaAppServer = "JavaAppServer"
        case javaAppServerVersion = "JavaAppServerVersion"
        case jvm = "Jvm"
        case jvmOptions = "JvmOptions"
        case jvmVersion = "JvmVersion"
        case manageBundler = "ManageBundler"
        case memcachedMemory = "MemcachedMemory"
        case mysqlRootPassword = "MysqlRootPassword"
        case mysqlRootPasswordUbiquitous = "MysqlRootPasswordUbiquitous"
        case nodejsVersion = "NodejsVersion"
        case passengerVersion = "PassengerVersion"
        case railsStack = "RailsStack"
        case rubyVersion = "RubyVersion"
        case rubygemsVersion = "RubygemsVersion"
        public var description: String { return self.rawValue }
    }

    public enum LayerType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case awsFlowRuby = "aws-flow-ruby"
        case custom = "custom"
        case dbMaster = "db-master"
        case ecsCluster = "ecs-cluster"
        case javaApp = "java-app"
        case lb = "lb"
        case memcached = "memcached"
        case monitoringMaster = "monitoring-master"
        case nodejsApp = "nodejs-app"
        case phpApp = "php-app"
        case railsApp = "rails-app"
        case web = "web"
        public var description: String { return self.rawValue }
    }

    public enum RootDeviceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ebs = "ebs"
        case instanceStore = "instance-store"
        public var description: String { return self.rawValue }
    }

    public enum SourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case archive = "archive"
        case git = "git"
        case s3 = "s3"
        case svn = "svn"
        public var description: String { return self.rawValue }
    }

    public enum StackAttributesKeys: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case color = "Color"
        public var description: String { return self.rawValue }
    }

    public enum VirtualizationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case hvm = "hvm"
        case paravirtual = "paravirtual"
        public var description: String { return self.rawValue }
    }

    public enum VolumeType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case gp2 = "gp2"
        case io1 = "io1"
        case standard = "standard"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AgentVersion: AWSDecodableShape {
        /// The configuration manager.
        public let configurationManager: StackConfigurationManager?
        /// The agent version.
        public let version: String?

        @inlinable
        public init(configurationManager: StackConfigurationManager? = nil, version: String? = nil) {
            self.configurationManager = configurationManager
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case configurationManager = "ConfigurationManager"
            case version = "Version"
        }
    }

    public struct App: AWSDecodableShape {
        /// The app ID.
        public let appId: String?
        /// A Source object that describes the app repository.
        public let appSource: Source?
        /// The stack attributes.
        public let attributes: [AppAttributesKeys: String]?
        /// When the app was created.
        public let createdAt: String?
        /// The app's data sources.
        public let dataSources: [DataSource]?
        /// A description of the app.
        public let description: String?
        /// The app vhost settings with multiple domains separated by commas. For example: 'www.example.com, example.com'
        public let domains: [String]?
        /// Whether to enable SSL for the app.
        public let enableSsl: Bool?
        /// An array of EnvironmentVariable objects that specify environment variables to be associated with the app. After you deploy the app, these variables are defined on the associated app server instances. For more information, see  Environment Variables.   There is no specific limit on the number of environment variables.  However, the size of the associated data structure - which includes the variable names, values, and protected flag  values - cannot exceed 20 KB. This limit should accommodate most if not all use cases, but if you do exceed it, you  will cause an exception (API) with an "Environment: is too large (maximum is 20 KB)" message.
        public let environment: [EnvironmentVariable]?
        /// The app name.
        public let name: String?
        /// The app's short name.
        public let shortname: String?
        /// An SslConfiguration object with the SSL configuration.
        public let sslConfiguration: SslConfiguration?
        /// The app stack ID.
        public let stackId: String?
        /// The app type.
        public let type: AppType?

        @inlinable
        public init(appId: String? = nil, appSource: Source? = nil, attributes: [AppAttributesKeys: String]? = nil, createdAt: String? = nil, dataSources: [DataSource]? = nil, description: String? = nil, domains: [String]? = nil, enableSsl: Bool? = nil, environment: [EnvironmentVariable]? = nil, name: String? = nil, shortname: String? = nil, sslConfiguration: SslConfiguration? = nil, stackId: String? = nil, type: AppType? = nil) {
            self.appId = appId
            self.appSource = appSource
            self.attributes = attributes
            self.createdAt = createdAt
            self.dataSources = dataSources
            self.description = description
            self.domains = domains
            self.enableSsl = enableSsl
            self.environment = environment
            self.name = name
            self.shortname = shortname
            self.sslConfiguration = sslConfiguration
            self.stackId = stackId
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
            case appSource = "AppSource"
            case attributes = "Attributes"
            case createdAt = "CreatedAt"
            case dataSources = "DataSources"
            case description = "Description"
            case domains = "Domains"
            case enableSsl = "EnableSsl"
            case environment = "Environment"
            case name = "Name"
            case shortname = "Shortname"
            case sslConfiguration = "SslConfiguration"
            case stackId = "StackId"
            case type = "Type"
        }
    }

    public struct AssignInstanceRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String
        /// The layer ID, which must correspond to a custom layer. You cannot assign a registered instance to a built-in layer.
        public let layerIds: [String]

        @inlinable
        public init(instanceId: String, layerIds: [String]) {
            self.instanceId = instanceId
            self.layerIds = layerIds
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case layerIds = "LayerIds"
        }
    }

    public struct AssignVolumeRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String?
        /// The volume ID.
        public let volumeId: String

        @inlinable
        public init(instanceId: String? = nil, volumeId: String) {
            self.instanceId = instanceId
            self.volumeId = volumeId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case volumeId = "VolumeId"
        }
    }

    public struct AssociateElasticIpRequest: AWSEncodableShape {
        /// The Elastic IP address.
        public let elasticIp: String
        /// The instance ID.
        public let instanceId: String?

        @inlinable
        public init(elasticIp: String, instanceId: String? = nil) {
            self.elasticIp = elasticIp
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
            case instanceId = "InstanceId"
        }
    }

    public struct AttachElasticLoadBalancerRequest: AWSEncodableShape {
        /// The Elastic Load Balancing instance's name.
        public let elasticLoadBalancerName: String
        /// The ID of the layer to which the Elastic Load Balancing instance is to be attached.
        public let layerId: String

        @inlinable
        public init(elasticLoadBalancerName: String, layerId: String) {
            self.elasticLoadBalancerName = elasticLoadBalancerName
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case elasticLoadBalancerName = "ElasticLoadBalancerName"
            case layerId = "LayerId"
        }
    }

    public struct AutoScalingThresholds: AWSEncodableShape & AWSDecodableShape {
        /// Custom CloudWatch auto scaling alarms, to be used as thresholds. This parameter takes a list of up to five alarm names, which are case sensitive and must be in the same region as the stack.  To use custom alarms, you must update your service role to allow cloudwatch:DescribeAlarms. You can either have OpsWorks Stacks update the role for you when you first use this feature or you can edit the role manually. For more information, see Allowing OpsWorks Stacks to Act on Your Behalf.
        public let alarms: [String]?
        /// The CPU utilization threshold, as a percent of the available CPU. A value of -1 disables the threshold.
        public let cpuThreshold: Double?
        /// The amount of time (in minutes) after a scaling event occurs that OpsWorks Stacks should ignore metrics and suppress additional scaling events. For example, OpsWorks Stacks adds new instances following an upscaling event but the instances won't start reducing the load until they have been booted and configured. There is no point in raising additional scaling events during that operation, which typically takes several minutes. IgnoreMetricsTime allows you to direct OpsWorks Stacks to suppress scaling events long enough to get the new instances online.
        public let ignoreMetricsTime: Int?
        /// The number of instances to add or remove when the load exceeds a threshold.
        public let instanceCount: Int?
        /// The load threshold. A value of -1 disables the threshold. For more information about how load is computed,  see Load (computing).
        public let loadThreshold: Double?
        /// The memory utilization threshold, as a percent of the available memory. A value of -1 disables the threshold.
        public let memoryThreshold: Double?
        /// The amount of time, in minutes, that the load must exceed a threshold before more instances are added or removed.
        public let thresholdsWaitTime: Int?

        @inlinable
        public init(alarms: [String]? = nil, cpuThreshold: Double? = nil, ignoreMetricsTime: Int? = nil, instanceCount: Int? = nil, loadThreshold: Double? = nil, memoryThreshold: Double? = nil, thresholdsWaitTime: Int? = nil) {
            self.alarms = alarms
            self.cpuThreshold = cpuThreshold
            self.ignoreMetricsTime = ignoreMetricsTime
            self.instanceCount = instanceCount
            self.loadThreshold = loadThreshold
            self.memoryThreshold = memoryThreshold
            self.thresholdsWaitTime = thresholdsWaitTime
        }

        public func validate(name: String) throws {
            try self.validate(self.ignoreMetricsTime, name: "ignoreMetricsTime", parent: name, max: 100)
            try self.validate(self.ignoreMetricsTime, name: "ignoreMetricsTime", parent: name, min: 1)
            try self.validate(self.thresholdsWaitTime, name: "thresholdsWaitTime", parent: name, max: 100)
            try self.validate(self.thresholdsWaitTime, name: "thresholdsWaitTime", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case alarms = "Alarms"
            case cpuThreshold = "CpuThreshold"
            case ignoreMetricsTime = "IgnoreMetricsTime"
            case instanceCount = "InstanceCount"
            case loadThreshold = "LoadThreshold"
            case memoryThreshold = "MemoryThreshold"
            case thresholdsWaitTime = "ThresholdsWaitTime"
        }
    }

    public struct BlockDeviceMapping: AWSEncodableShape & AWSDecodableShape {
        /// The device name that is exposed to the instance, such as /dev/sdh. For the root device, you can use the explicit device name or you can set this parameter to ROOT_DEVICE and OpsWorks Stacks will provide the correct device name.
        public let deviceName: String?
        /// An EBSBlockDevice that defines how to configure an Amazon EBS volume when the instance is launched.
        public let ebs: EbsBlockDevice?
        /// Suppresses the specified device included in the AMI's block device mapping.
        public let noDevice: String?
        /// The virtual device name. For more information, see BlockDeviceMapping.
        public let virtualName: String?

        @inlinable
        public init(deviceName: String? = nil, ebs: EbsBlockDevice? = nil, noDevice: String? = nil, virtualName: String? = nil) {
            self.deviceName = deviceName
            self.ebs = ebs
            self.noDevice = noDevice
            self.virtualName = virtualName
        }

        private enum CodingKeys: String, CodingKey {
            case deviceName = "DeviceName"
            case ebs = "Ebs"
            case noDevice = "NoDevice"
            case virtualName = "VirtualName"
        }
    }

    public struct ChefConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// The Berkshelf version.
        public let berkshelfVersion: String?
        /// Whether to enable Berkshelf.
        public let manageBerkshelf: Bool?

        @inlinable
        public init(berkshelfVersion: String? = nil, manageBerkshelf: Bool? = nil) {
            self.berkshelfVersion = berkshelfVersion
            self.manageBerkshelf = manageBerkshelf
        }

        private enum CodingKeys: String, CodingKey {
            case berkshelfVersion = "BerkshelfVersion"
            case manageBerkshelf = "ManageBerkshelf"
        }
    }

    public struct CloneStackRequest: AWSEncodableShape {
        /// The default OpsWorks Stacks agent version. You have the following options:   Auto-update - Set this parameter to LATEST. OpsWorks Stacks automatically installs new agent versions on the stack's instances as soon as they are available.   Fixed version - Set this parameter to your preferred agent version. To update  the agent version, you must edit the stack configuration and specify a new version.  OpsWorks Stacks automatically installs that version on the stack's instances.   The default setting is LATEST. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call DescribeAgentVersions. AgentVersion cannot be set to Chef 12.2.  You can also specify an agent version when you create or update an instance, which overrides the stack's  default setting.
        public let agentVersion: String?
        /// A list of stack attributes and values as key/value pairs to be added to the cloned stack.
        public let attributes: [StackAttributesKeys: String]?
        /// A ChefConfiguration object that specifies whether to enable Berkshelf and the Berkshelf version on Chef 11.10 stacks. For more information, see Create a New Stack.
        public let chefConfiguration: ChefConfiguration?
        /// A list of source stack app IDs to be included in the cloned stack.
        public let cloneAppIds: [String]?
        /// Whether to clone the source stack's permissions.
        public let clonePermissions: Bool?
        /// The configuration manager. When you clone a stack we recommend that you use the configuration manager to specify the  Chef version: 12, 11.10, or 11.4 for Linux stacks, or 12.2 for Windows stacks. The default value for Linux stacks is currently 12.
        public let configurationManager: StackConfigurationManager?
        /// Contains the information required to retrieve an app or cookbook from a repository. For more information,  see Adding Apps or  Cookbooks and Recipes.
        public let customCookbooksSource: Source?
        /// A string that contains user-defined, custom JSON. It is used to override the corresponding default stack configuration  JSON values. The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information about custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes
        public let customJson: String?
        /// The cloned stack's default Availability Zone, which must be in the specified region. For more information, see Regions and Endpoints. If you also specify a value for DefaultSubnetId, the subnet must be in the same zone. For more information, see the VpcId parameter description.
        public let defaultAvailabilityZone: String?
        /// The Amazon Resource Name (ARN) of an IAM profile that is the default profile for all of the stack's  EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let defaultInstanceProfileArn: String?
        /// The stack's operating system, which must be set to one of the following.   A supported Linux operating system: An Amazon Linux version, such as Amazon Linux 2, Amazon Linux 2018.03, Amazon Linux 2017.09, Amazon Linux 2017.03, Amazon Linux 2016.09, Amazon Linux 2016.03, Amazon Linux 2015.09, or Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 18.04 LTS, Ubuntu 16.04 LTS, Ubuntu 14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7     Microsoft Windows Server 2012 R2 Base, Microsoft Windows Server 2012 R2 with SQL Server Express,  Microsoft Windows Server 2012 R2 with SQL Server Standard, or Microsoft Windows Server 2012 R2 with SQL Server Web.   A custom AMI: Custom. You specify the custom AMI you want to use when you create instances. For more information about how to use custom AMIs with OpsWorks, see Using Custom AMIs.   The default option is the parent stack's operating system. Not all operating systems are supported with all versions of Chef. For more information about supported operating systems, see OpsWorks Stacks Operating Systems.  You can specify a different Linux operating system for the cloned stack, but you cannot change from Linux to  Windows or Windows to Linux.
        public let defaultOs: String?
        /// The default root device type. This value is used by default for all instances in the cloned stack, but you can override it when you create an instance. For more information, see Storage for the Root Device.
        public let defaultRootDeviceType: RootDeviceType?
        /// A default Amazon EC2 key pair name. The default value is none. If you specify a key pair name,  OpsWorks installs the public key on the instance and you can use the private key with an SSH client to log in to the instance. For more information, see  Using SSH to Communicate with an Instance and  Managing SSH Access. You can override this setting by specifying a different key pair, or no key pair, when you  create an instance.
        public let defaultSshKeyName: String?
        /// The stack's default VPC subnet ID. This parameter is required if you specify a value for the VpcId parameter. All instances are launched into this subnet unless you specify otherwise when you create the instance. If you also specify a value for DefaultAvailabilityZone, the subnet must be in that zone. For information on default values and when this parameter is required, see the VpcId parameter description.
        public let defaultSubnetId: String?
        /// The stack's host name theme, with spaces are replaced by underscores. The theme is used to generate host names for the stack's instances. By default, HostnameTheme is set to Layer_Dependent, which creates host names by appending integers to the layer's short name. The other themes are:    Baked_Goods     Clouds     Europe_Cities     Fruits     Greek_Deities_and_Titans     Legendary_creatures_from_Japan     Planets_and_Moons     Roman_Deities     Scottish_Islands     US_Cities     Wild_Cats    To obtain a generated host name, call GetHostNameSuggestion, which returns a host name based on the current theme.
        public let hostnameTheme: String?
        /// The cloned stack name. Stack names can be a maximum of 64 characters.
        public let name: String?
        /// The cloned stack Amazon Web Services Region, such as ap-northeast-2. For more information  about Amazon Web Services Regions, see Regions and Endpoints.
        public let region: String?
        /// The stack Identity and Access Management (IAM) role, which allows OpsWorks Stacks to work with Amazon Web Services resources on your behalf. You must set this parameter to the Amazon Resource Name (ARN) for an existing IAM role. If you create a stack by using the OpsWorkss Stacks console, it creates the role for you. You can obtain an existing stack's IAM ARN programmatically by calling DescribePermissions. For more information about IAM ARNs, see  Using Identifiers.  You must set this parameter to a valid service role ARN or the action will fail; there is no default value.  You can specify the source stack's service role ARN, if you prefer, but you must do so explicitly.
        public let serviceRoleArn: String
        /// The source stack ID.
        public let sourceStackId: String
        /// Whether to use custom cookbooks.
        public let useCustomCookbooks: Bool?
        /// Whether to associate the OpsWorks Stacks built-in security groups with the stack's layers. OpsWorks Stacks provides a standard set of security groups, one for each layer, which are associated with layers by default. With UseOpsworksSecurityGroups you can instead provide your own custom security groups. UseOpsworksSecurityGroups has the following settings:    True - OpsWorks Stacks automatically associates the appropriate built-in security group with  each layer (default setting). You can associate additional security groups with a layer after you create it but you cannot  delete the built-in security group.   False - OpsWorks Stacks does not associate built-in security groups with layers.  You must create appropriate Amazon EC2 security groups and associate a security group with each  layer that you create. However, you can still manually associate a built-in security group with a layer on creation;  custom security groups are required only for those layers that need custom settings.   For more information, see Create a New Stack.
        public let useOpsworksSecurityGroups: Bool?
        /// The ID of the VPC that the cloned stack is to be launched into. It must be in the specified region. All instances are launched into this VPC, and you cannot change the ID later.   If your account supports EC2 Classic, the default value is no VPC.   If your account does not support EC2 Classic, the default value is the default VPC for the specified region.   If the VPC ID corresponds to a default VPC and you have specified either the DefaultAvailabilityZone or the DefaultSubnetId parameter only, OpsWorks Stacks infers the value of the other parameter. If you specify neither parameter, OpsWorks Stacks sets these parameters to the first valid Availability Zone for the specified region and the corresponding default VPC subnet ID, respectively.  If you specify a nondefault VPC ID, note the following:   It must belong to a VPC in your account that is in the specified region.   You must specify a value for DefaultSubnetId.   For more information about how to use OpsWorks Stacks with a VPC, see Running a Stack in a VPC. For more information about default VPC and EC2 Classic, see Supported Platforms.
        public let vpcId: String?

        @inlinable
        public init(agentVersion: String? = nil, attributes: [StackAttributesKeys: String]? = nil, chefConfiguration: ChefConfiguration? = nil, cloneAppIds: [String]? = nil, clonePermissions: Bool? = nil, configurationManager: StackConfigurationManager? = nil, customCookbooksSource: Source? = nil, customJson: String? = nil, defaultAvailabilityZone: String? = nil, defaultInstanceProfileArn: String? = nil, defaultOs: String? = nil, defaultRootDeviceType: RootDeviceType? = nil, defaultSshKeyName: String? = nil, defaultSubnetId: String? = nil, hostnameTheme: String? = nil, name: String? = nil, region: String? = nil, serviceRoleArn: String, sourceStackId: String, useCustomCookbooks: Bool? = nil, useOpsworksSecurityGroups: Bool? = nil, vpcId: String? = nil) {
            self.agentVersion = agentVersion
            self.attributes = attributes
            self.chefConfiguration = chefConfiguration
            self.cloneAppIds = cloneAppIds
            self.clonePermissions = clonePermissions
            self.configurationManager = configurationManager
            self.customCookbooksSource = customCookbooksSource
            self.customJson = customJson
            self.defaultAvailabilityZone = defaultAvailabilityZone
            self.defaultInstanceProfileArn = defaultInstanceProfileArn
            self.defaultOs = defaultOs
            self.defaultRootDeviceType = defaultRootDeviceType
            self.defaultSshKeyName = defaultSshKeyName
            self.defaultSubnetId = defaultSubnetId
            self.hostnameTheme = hostnameTheme
            self.name = name
            self.region = region
            self.serviceRoleArn = serviceRoleArn
            self.sourceStackId = sourceStackId
            self.useCustomCookbooks = useCustomCookbooks
            self.useOpsworksSecurityGroups = useOpsworksSecurityGroups
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case attributes = "Attributes"
            case chefConfiguration = "ChefConfiguration"
            case cloneAppIds = "CloneAppIds"
            case clonePermissions = "ClonePermissions"
            case configurationManager = "ConfigurationManager"
            case customCookbooksSource = "CustomCookbooksSource"
            case customJson = "CustomJson"
            case defaultAvailabilityZone = "DefaultAvailabilityZone"
            case defaultInstanceProfileArn = "DefaultInstanceProfileArn"
            case defaultOs = "DefaultOs"
            case defaultRootDeviceType = "DefaultRootDeviceType"
            case defaultSshKeyName = "DefaultSshKeyName"
            case defaultSubnetId = "DefaultSubnetId"
            case hostnameTheme = "HostnameTheme"
            case name = "Name"
            case region = "Region"
            case serviceRoleArn = "ServiceRoleArn"
            case sourceStackId = "SourceStackId"
            case useCustomCookbooks = "UseCustomCookbooks"
            case useOpsworksSecurityGroups = "UseOpsworksSecurityGroups"
            case vpcId = "VpcId"
        }
    }

    public struct CloneStackResult: AWSDecodableShape {
        /// The cloned stack ID.
        public let stackId: String?

        @inlinable
        public init(stackId: String? = nil) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct CloudWatchLogsConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// Whether CloudWatch Logs is enabled for a layer.
        public let enabled: Bool?
        /// A list of configuration options for CloudWatch Logs.
        public let logStreams: [CloudWatchLogsLogStream]?

        @inlinable
        public init(enabled: Bool? = nil, logStreams: [CloudWatchLogsLogStream]? = nil) {
            self.enabled = enabled
            self.logStreams = logStreams
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
            case logStreams = "LogStreams"
        }
    }

    public struct CloudWatchLogsLogStream: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the max number of log events in a batch, up to 10000. The default value is 1000.
        public let batchCount: Int?
        /// Specifies the maximum size of log events in a batch, in bytes, up to 1048576 bytes.  The default value is 32768 bytes. This size is calculated as the sum of all event messages  in UTF-8, plus 26 bytes for each log event.
        public let batchSize: Int?
        /// Specifies the time duration for the batching of log events. The minimum value is 5000ms and default value is 5000ms.
        public let bufferDuration: Int?
        /// Specifies how the time stamp is extracted from logs. For more information, see the  CloudWatch Logs Agent Reference.
        public let datetimeFormat: String?
        /// Specifies the encoding of the log file so that the file can be read correctly.  The default is utf_8. Encodings supported by Python codecs.decode() can be used here.
        public let encoding: CloudWatchLogsEncoding?
        /// Specifies log files that you want to push to CloudWatch Logs.  File can point to a specific file or multiple files (by using wild card characters such  as /var/log/system.log*). Only the latest file is pushed to CloudWatch Logs, based on file modification time. We recommend that you use  wild card characters to specify a series of files of the same type, such as access_log.2014-06-01-01, access_log.2014-06-01-02, and so on by using a pattern like access_log.*. Don't use a wildcard to match multiple file types, such as access_log_80 and access_log_443. To specify multiple, different file types, add another log stream entry to the configuration file, so that each log file type is stored in a different log group. Zipped files are not supported.
        public let file: String?
        /// Specifies the range of lines for identifying a file. The valid values are one number, or two dash-delimited numbers,  such as '1', '2-5'. The default value is '1', meaning the first line is used to calculate the fingerprint.  Fingerprint lines are  not sent to CloudWatch Logs unless all specified lines are available.
        public let fileFingerprintLines: String?
        /// Specifies where to start to read data (start_of_file or end_of_file). The default is start_of_file.  This setting is only used if there is no state persisted for that log stream.
        public let initialPosition: CloudWatchLogsInitialPosition?
        /// Specifies the destination log group. A log group is created automatically if it doesn't already exist.  Log group names can be between 1 and 512 characters long. Allowed characters include a-z, A-Z, 0-9, '_' (underscore),  '-' (hyphen), '/' (forward slash), and '.' (period).
        public let logGroupName: String?
        /// Specifies the pattern for identifying the start of a log message.
        public let multiLineStartPattern: String?
        /// Specifies the time zone of log event time stamps.
        public let timeZone: CloudWatchLogsTimeZone?

        @inlinable
        public init(batchCount: Int? = nil, batchSize: Int? = nil, bufferDuration: Int? = nil, datetimeFormat: String? = nil, encoding: CloudWatchLogsEncoding? = nil, file: String? = nil, fileFingerprintLines: String? = nil, initialPosition: CloudWatchLogsInitialPosition? = nil, logGroupName: String? = nil, multiLineStartPattern: String? = nil, timeZone: CloudWatchLogsTimeZone? = nil) {
            self.batchCount = batchCount
            self.batchSize = batchSize
            self.bufferDuration = bufferDuration
            self.datetimeFormat = datetimeFormat
            self.encoding = encoding
            self.file = file
            self.fileFingerprintLines = fileFingerprintLines
            self.initialPosition = initialPosition
            self.logGroupName = logGroupName
            self.multiLineStartPattern = multiLineStartPattern
            self.timeZone = timeZone
        }

        private enum CodingKeys: String, CodingKey {
            case batchCount = "BatchCount"
            case batchSize = "BatchSize"
            case bufferDuration = "BufferDuration"
            case datetimeFormat = "DatetimeFormat"
            case encoding = "Encoding"
            case file = "File"
            case fileFingerprintLines = "FileFingerprintLines"
            case initialPosition = "InitialPosition"
            case logGroupName = "LogGroupName"
            case multiLineStartPattern = "MultiLineStartPattern"
            case timeZone = "TimeZone"
        }
    }

    public struct Command: AWSDecodableShape {
        /// Date and time when the command was acknowledged.
        public let acknowledgedAt: String?
        /// The command ID.
        public let commandId: String?
        /// Date when the command completed.
        public let completedAt: String?
        /// Date and time when the command was run.
        public let createdAt: String?
        /// The command deployment ID.
        public let deploymentId: String?
        /// The command exit code.
        public let exitCode: Int?
        /// The ID of the instance where the command was executed.
        public let instanceId: String?
        /// The URL of the command log.
        public let logUrl: String?
        /// The command status:   failed   successful   skipped   pending
        public let status: String?
        /// The command type:    configure     deploy     execute_recipes     install_dependencies     restart     rollback     setup     start     stop     undeploy     update_custom_cookbooks     update_dependencies
        public let type: String?

        @inlinable
        public init(acknowledgedAt: String? = nil, commandId: String? = nil, completedAt: String? = nil, createdAt: String? = nil, deploymentId: String? = nil, exitCode: Int? = nil, instanceId: String? = nil, logUrl: String? = nil, status: String? = nil, type: String? = nil) {
            self.acknowledgedAt = acknowledgedAt
            self.commandId = commandId
            self.completedAt = completedAt
            self.createdAt = createdAt
            self.deploymentId = deploymentId
            self.exitCode = exitCode
            self.instanceId = instanceId
            self.logUrl = logUrl
            self.status = status
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case acknowledgedAt = "AcknowledgedAt"
            case commandId = "CommandId"
            case completedAt = "CompletedAt"
            case createdAt = "CreatedAt"
            case deploymentId = "DeploymentId"
            case exitCode = "ExitCode"
            case instanceId = "InstanceId"
            case logUrl = "LogUrl"
            case status = "Status"
            case type = "Type"
        }
    }

    public struct CreateAppRequest: AWSEncodableShape {
        /// A Source object that specifies the app repository.
        public let appSource: Source?
        /// One or more user-defined key/value pairs to be added to the stack attributes.
        public let attributes: [AppAttributesKeys: String]?
        /// The app's data source.
        public let dataSources: [DataSource]?
        /// A description of the app.
        public let description: String?
        /// The app virtual host settings, with multiple domains separated by commas. For example: 'www.example.com, example.com'
        public let domains: [String]?
        /// Whether to enable SSL for the app.
        public let enableSsl: Bool?
        /// An array of EnvironmentVariable objects that specify environment variables to be associated with the app. After you deploy the app, these variables are defined on the associated app server instance. For more information, see  Environment Variables. There is no specific limit on the number of environment variables. However, the size of the associated data structure - which includes the variables' names, values, and protected flag values - cannot exceed 20 KB. This limit should accommodate most if not all use cases. Exceeding it will cause an exception with the message, "Environment: is too large (maximum is 20KB)."  If you have specified one or more environment variables, you cannot modify the stack's Chef version.
        public let environment: [EnvironmentVariable]?
        /// The app name.
        public let name: String
        /// The app's short name.
        public let shortname: String?
        /// An SslConfiguration object with the SSL configuration.
        public let sslConfiguration: SslConfiguration?
        /// The stack ID.
        public let stackId: String
        /// The app type. Each supported type is associated with a particular layer. For example, PHP applications are associated with a PHP layer. OpsWorks Stacks deploys an application to those instances that are members of the corresponding layer. If your app isn't one of the standard types, or you prefer to implement your own Deploy recipes, specify other.
        public let type: AppType

        @inlinable
        public init(appSource: Source? = nil, attributes: [AppAttributesKeys: String]? = nil, dataSources: [DataSource]? = nil, description: String? = nil, domains: [String]? = nil, enableSsl: Bool? = nil, environment: [EnvironmentVariable]? = nil, name: String, shortname: String? = nil, sslConfiguration: SslConfiguration? = nil, stackId: String, type: AppType) {
            self.appSource = appSource
            self.attributes = attributes
            self.dataSources = dataSources
            self.description = description
            self.domains = domains
            self.enableSsl = enableSsl
            self.environment = environment
            self.name = name
            self.shortname = shortname
            self.sslConfiguration = sslConfiguration
            self.stackId = stackId
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case appSource = "AppSource"
            case attributes = "Attributes"
            case dataSources = "DataSources"
            case description = "Description"
            case domains = "Domains"
            case enableSsl = "EnableSsl"
            case environment = "Environment"
            case name = "Name"
            case shortname = "Shortname"
            case sslConfiguration = "SslConfiguration"
            case stackId = "StackId"
            case type = "Type"
        }
    }

    public struct CreateAppResult: AWSDecodableShape {
        /// The app ID.
        public let appId: String?

        @inlinable
        public init(appId: String? = nil) {
            self.appId = appId
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
        }
    }

    public struct CreateDeploymentRequest: AWSEncodableShape {
        /// The app ID. This parameter is required for app deployments, but not for other deployment commands.
        public let appId: String?
        /// A DeploymentCommand object that specifies the deployment command and any associated arguments.
        public let command: DeploymentCommand
        /// A user-defined comment.
        public let comment: String?
        /// A string that contains user-defined, custom JSON. You can use this parameter to override some corresponding default  stack configuration JSON values. The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information about custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes and  Overriding Attributes With Custom  JSON.
        public let customJson: String?
        /// The instance IDs for the deployment targets.
        public let instanceIds: [String]?
        /// The layer IDs for the deployment targets.
        public let layerIds: [String]?
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(appId: String? = nil, command: DeploymentCommand, comment: String? = nil, customJson: String? = nil, instanceIds: [String]? = nil, layerIds: [String]? = nil, stackId: String) {
            self.appId = appId
            self.command = command
            self.comment = comment
            self.customJson = customJson
            self.instanceIds = instanceIds
            self.layerIds = layerIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
            case command = "Command"
            case comment = "Comment"
            case customJson = "CustomJson"
            case instanceIds = "InstanceIds"
            case layerIds = "LayerIds"
            case stackId = "StackId"
        }
    }

    public struct CreateDeploymentResult: AWSDecodableShape {
        /// The deployment ID, which can be used with other requests to identify the deployment.
        public let deploymentId: String?

        @inlinable
        public init(deploymentId: String? = nil) {
            self.deploymentId = deploymentId
        }

        private enum CodingKeys: String, CodingKey {
            case deploymentId = "DeploymentId"
        }
    }

    public struct CreateInstanceRequest: AWSEncodableShape {
        /// The default OpsWorks Stacks agent version. You have the following options:    INHERIT - Use the stack's default agent version setting.    version_number - Use the specified agent version. This value overrides the stack's default setting. To update the agent version, edit the instance configuration and specify a new version. OpsWorks Stacks installs that version on the instance.   The default setting is INHERIT. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call DescribeAgentVersions.  AgentVersion cannot be set to Chef 12.2.
        public let agentVersion: String?
        /// A custom AMI ID to be used to create the instance. The AMI should be based on one of the supported operating systems. For more information, see Using Custom AMIs.  If you specify a custom AMI, you must set Os to Custom.
        public let amiId: String?
        /// The instance architecture. The default option is x86_64. Instance types do not necessarily support both architectures. For a list of the architectures that are supported by the different instance types, see Instance Families and Types.
        public let architecture: Architecture?
        /// For load-based or time-based instances, the type. Windows stacks can use only time-based instances.
        public let autoScalingType: AutoScalingType?
        /// The instance Availability Zone. For more information, see Regions and Endpoints.
        public let availabilityZone: String?
        /// An array of BlockDeviceMapping objects that specify the instance's block devices. For more information, see Block Device Mapping. Note that block device mappings are not supported for custom AMIs.
        public let blockDeviceMappings: [BlockDeviceMapping]?
        /// Whether to create an Amazon EBS-optimized instance.
        public let ebsOptimized: Bool?
        /// The instance host name. The following are character limits for instance host names.   Linux-based instances: 63 characters   Windows-based instances: 15 characters
        public let hostname: String?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. To control when updates are installed, set this value to false. You must then update your instances manually by using CreateDeployment to run the update_dependencies stack command or by manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We strongly recommend using the default value of true to ensure that your instances have the latest security updates.
        public let installUpdatesOnBoot: Bool?
        /// The instance type, such as t2.micro. For a list of supported instance types, open the stack in the console, choose Instances, and choose + Instance. The Size list contains the currently supported types.  For more information, see Instance Families and Types. The parameter values that you use to specify the various types are in the API Name column of the Available Instance Types table.
        public let instanceType: String
        /// An array that contains the instance's layer IDs.
        public let layerIds: [String]
        /// The instance's operating system, which must be set to one of the following.   A supported Linux operating system: An Amazon Linux version, such as Amazon Linux 2, Amazon Linux 2018.03, Amazon Linux 2017.09, Amazon Linux 2017.03, Amazon Linux 2016.09,  Amazon Linux 2016.03, Amazon Linux 2015.09, or Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 18.04 LTS, Ubuntu 16.04 LTS, Ubuntu 14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7    A supported Windows operating system, such as Microsoft Windows Server 2012 R2 Base, Microsoft Windows Server 2012 R2 with SQL Server Express,
        /// 			   Microsoft Windows Server 2012 R2 with SQL Server Standard, or Microsoft Windows Server 2012 R2 with SQL Server Web.   A custom AMI: Custom.   Not all operating systems are supported with all versions of Chef. For more information about the supported operating systems, see OpsWorks Stacks Operating Systems. The default option is the current Amazon Linux version. If you set this parameter to Custom, you must use the CreateInstance action's AmiId parameter to specify the custom AMI that you want to use. Block device mappings are not supported if the value is Custom.  For more information about how to use custom AMIs with OpsWorks Stacks, see Using Custom AMIs.
        public let os: String?
        /// The instance root device type. For more information, see Storage for the Root Device.
        public let rootDeviceType: RootDeviceType?
        /// The instance's Amazon EC2 key-pair name.
        public let sshKeyName: String?
        /// The stack ID.
        public let stackId: String
        /// The ID of the instance's subnet. If the stack is running in a VPC, you can use this parameter to override the stack's  default subnet ID value and direct OpsWorks Stacks to launch the instance in a different subnet.
        public let subnetId: String?
        /// The instance's tenancy option. The default option is no tenancy, or if the instance is running in a VPC,  inherit tenancy settings from the VPC. The following are valid values for this parameter:   dedicated, default, or host. Because there are costs associated with changes  in tenancy options, we recommend that you research tenancy options before choosing them for your instances.  For more information about dedicated hosts, see  Dedicated Hosts Overview and  Amazon EC2 Dedicated Hosts.  For more information about dedicated instances, see  Dedicated Instances and  Amazon EC2 Dedicated Instances.
        public let tenancy: String?
        /// The instance's virtualization type, paravirtual or hvm.
        public let virtualizationType: String?

        @inlinable
        public init(agentVersion: String? = nil, amiId: String? = nil, architecture: Architecture? = nil, autoScalingType: AutoScalingType? = nil, availabilityZone: String? = nil, blockDeviceMappings: [BlockDeviceMapping]? = nil, ebsOptimized: Bool? = nil, hostname: String? = nil, installUpdatesOnBoot: Bool? = nil, instanceType: String, layerIds: [String], os: String? = nil, rootDeviceType: RootDeviceType? = nil, sshKeyName: String? = nil, stackId: String, subnetId: String? = nil, tenancy: String? = nil, virtualizationType: String? = nil) {
            self.agentVersion = agentVersion
            self.amiId = amiId
            self.architecture = architecture
            self.autoScalingType = autoScalingType
            self.availabilityZone = availabilityZone
            self.blockDeviceMappings = blockDeviceMappings
            self.ebsOptimized = ebsOptimized
            self.hostname = hostname
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.instanceType = instanceType
            self.layerIds = layerIds
            self.os = os
            self.rootDeviceType = rootDeviceType
            self.sshKeyName = sshKeyName
            self.stackId = stackId
            self.subnetId = subnetId
            self.tenancy = tenancy
            self.virtualizationType = virtualizationType
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case amiId = "AmiId"
            case architecture = "Architecture"
            case autoScalingType = "AutoScalingType"
            case availabilityZone = "AvailabilityZone"
            case blockDeviceMappings = "BlockDeviceMappings"
            case ebsOptimized = "EbsOptimized"
            case hostname = "Hostname"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case instanceType = "InstanceType"
            case layerIds = "LayerIds"
            case os = "Os"
            case rootDeviceType = "RootDeviceType"
            case sshKeyName = "SshKeyName"
            case stackId = "StackId"
            case subnetId = "SubnetId"
            case tenancy = "Tenancy"
            case virtualizationType = "VirtualizationType"
        }
    }

    public struct CreateInstanceResult: AWSDecodableShape {
        /// The instance ID.
        public let instanceId: String?

        @inlinable
        public init(instanceId: String? = nil) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct CreateLayerRequest: AWSEncodableShape {
        /// One or more user-defined key-value pairs to be added to the stack attributes. To create a cluster layer, set the EcsClusterArn attribute to the cluster's ARN.
        public let attributes: [LayerAttributesKeys: String]?
        /// Whether to automatically assign an Elastic IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignElasticIps: Bool?
        /// For stacks that are running in a VPC, whether to automatically assign a public IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignPublicIps: Bool?
        /// Specifies CloudWatch Logs configuration options for the layer. For more information,  see CloudWatchLogsLogStream.
        public let cloudWatchLogsConfiguration: CloudWatchLogsConfiguration?
        /// The ARN of an IAM profile to be used for the layer's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let customInstanceProfileArn: String?
        /// A JSON-formatted string containing custom stack configuration and deployment attributes to be installed on the layer's instances. For more information, see  Using Custom JSON. This feature is supported as of version 1.7.42 of the CLI.
        public let customJson: String?
        /// A LayerCustomRecipes object that specifies the layer custom recipes.
        public let customRecipes: Recipes?
        /// An array containing the layer custom security group IDs.
        public let customSecurityGroupIds: [String]?
        /// Whether to disable auto healing for the layer.
        public let enableAutoHealing: Bool?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. To control when updates are installed, set this value to false. You must then update your instances manually by using CreateDeployment to run the update_dependencies stack command or by manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   To ensure that your instances have the latest security updates, we strongly recommend using the default value of true.
        public let installUpdatesOnBoot: Bool?
        /// A LifeCycleEventConfiguration object that you can use to configure the Shutdown event to specify an execution timeout and enable or disable Elastic Load Balancer connection draining.
        public let lifecycleEventConfiguration: LifecycleEventConfiguration?
        /// The layer name, which is used by the console. Layer names can be a maximum of 32 characters.
        public let name: String
        /// An array of Package objects that describes the layer packages.
        public let packages: [String]?
        /// For custom layers only, use this parameter to specify the layer's short name, which is used internally by  OpsWorks Stacks and by Chef recipes. The short name is also used as the name for the directory where your  app files are installed. It can have a maximum of 32 characters, which are limited to the alphanumeric  characters, '-', '_', and '.'. Built-in layer short names are defined by OpsWorks Stacks. For more information, see the  Layer Reference.
        public let shortname: String
        /// The layer stack ID.
        public let stackId: String
        /// The layer type. A stack cannot have more than one built-in layer of the same type. It can have any number of custom layers.  Built-in layers are not available in Chef 12 stacks.
        public let type: LayerType
        /// Whether to use Amazon EBS-optimized instances.
        public let useEbsOptimizedInstances: Bool?
        /// A VolumeConfigurations object that describes the layer's Amazon EBS volumes.
        public let volumeConfigurations: [VolumeConfiguration]?

        @inlinable
        public init(attributes: [LayerAttributesKeys: String]? = nil, autoAssignElasticIps: Bool? = nil, autoAssignPublicIps: Bool? = nil, cloudWatchLogsConfiguration: CloudWatchLogsConfiguration? = nil, customInstanceProfileArn: String? = nil, customJson: String? = nil, customRecipes: Recipes? = nil, customSecurityGroupIds: [String]? = nil, enableAutoHealing: Bool? = nil, installUpdatesOnBoot: Bool? = nil, lifecycleEventConfiguration: LifecycleEventConfiguration? = nil, name: String, packages: [String]? = nil, shortname: String, stackId: String, type: LayerType, useEbsOptimizedInstances: Bool? = nil, volumeConfigurations: [VolumeConfiguration]? = nil) {
            self.attributes = attributes
            self.autoAssignElasticIps = autoAssignElasticIps
            self.autoAssignPublicIps = autoAssignPublicIps
            self.cloudWatchLogsConfiguration = cloudWatchLogsConfiguration
            self.customInstanceProfileArn = customInstanceProfileArn
            self.customJson = customJson
            self.customRecipes = customRecipes
            self.customSecurityGroupIds = customSecurityGroupIds
            self.enableAutoHealing = enableAutoHealing
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.lifecycleEventConfiguration = lifecycleEventConfiguration
            self.name = name
            self.packages = packages
            self.shortname = shortname
            self.stackId = stackId
            self.type = type
            self.useEbsOptimizedInstances = useEbsOptimizedInstances
            self.volumeConfigurations = volumeConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case autoAssignElasticIps = "AutoAssignElasticIps"
            case autoAssignPublicIps = "AutoAssignPublicIps"
            case cloudWatchLogsConfiguration = "CloudWatchLogsConfiguration"
            case customInstanceProfileArn = "CustomInstanceProfileArn"
            case customJson = "CustomJson"
            case customRecipes = "CustomRecipes"
            case customSecurityGroupIds = "CustomSecurityGroupIds"
            case enableAutoHealing = "EnableAutoHealing"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case lifecycleEventConfiguration = "LifecycleEventConfiguration"
            case name = "Name"
            case packages = "Packages"
            case shortname = "Shortname"
            case stackId = "StackId"
            case type = "Type"
            case useEbsOptimizedInstances = "UseEbsOptimizedInstances"
            case volumeConfigurations = "VolumeConfigurations"
        }
    }

    public struct CreateLayerResult: AWSDecodableShape {
        /// The layer ID.
        public let layerId: String?

        @inlinable
        public init(layerId: String? = nil) {
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case layerId = "LayerId"
        }
    }

    public struct CreateStackRequest: AWSEncodableShape {
        /// The default OpsWorks Stacks agent version. You have the following options:   Auto-update - Set this parameter to LATEST. OpsWorks Stacks automatically installs new agent versions on the stack's instances as soon as they are available.   Fixed version - Set this parameter to your preferred agent version. To update the agent version,  you must edit the stack configuration and specify a new version. OpsWorks Stacks installs  that version on the stack's instances.   The default setting is the most recent release of the agent. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call DescribeAgentVersions. AgentVersion cannot be set to Chef 12.2.  You can also specify an agent version when you create or update an instance,  which overrides the stack's default setting.
        public let agentVersion: String?
        /// One or more user-defined key-value pairs to be added to the stack attributes.
        public let attributes: [StackAttributesKeys: String]?
        /// A ChefConfiguration object that specifies whether to enable Berkshelf and the Berkshelf version on Chef 11.10 stacks. For more information, see Create a New Stack.
        public let chefConfiguration: ChefConfiguration?
        /// The configuration manager. When you create a stack we recommend that you use the configuration manager to specify the  Chef version: 12, 11.10, or 11.4 for Linux stacks, or 12.2 for Windows stacks. The default value for Linux stacks is  currently 12.
        public let configurationManager: StackConfigurationManager?
        /// Contains the information required to retrieve an app or cookbook from a repository. For more information,  see Adding Apps or  Cookbooks and Recipes.
        public let customCookbooksSource: Source?
        /// A string that contains user-defined, custom JSON. It can be used to override the corresponding default stack configuration  attribute values or to pass data to recipes. The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information about custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes.
        public let customJson: String?
        /// The stack's default Availability Zone, which must be in the specified region. For more information, see Regions and Endpoints. If you also specify a value for DefaultSubnetId, the subnet must be in the same zone. For more information, see the VpcId parameter description.
        public let defaultAvailabilityZone: String?
        /// The Amazon Resource Name (ARN) of an IAM profile that is the default profile for all of the stack's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let defaultInstanceProfileArn: String
        /// The stack's default operating system, which is installed on every instance unless you specify a different operating  system when you create the instance. You can specify one of the following.   A supported Linux operating system: An Amazon Linux version, such as Amazon Linux 2, Amazon Linux 2018.03, Amazon Linux 2017.09, Amazon Linux 2017.03, Amazon Linux 2016.09,  Amazon Linux 2016.03, Amazon Linux 2015.09, or Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 18.04 LTS, Ubuntu 16.04 LTS, Ubuntu 14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7    A supported Windows operating system, such as Microsoft Windows Server 2012 R2 Base,  Microsoft Windows Server 2012 R2 with SQL Server Express,  Microsoft Windows Server 2012 R2 with SQL Server Standard, or  Microsoft Windows Server 2012 R2 with SQL Server Web.   A custom AMI: Custom. You specify the custom AMI you want to use when you create instances. For more information, see  Using Custom AMIs.   The default option is the current Amazon Linux version. Not all operating systems are supported with all versions of Chef. For more information about supported operating systems, see OpsWorks Stacks Operating Systems.
        public let defaultOs: String?
        /// The default root device type. This value is the default for all instances in the stack, but you can override it when you create an instance. The default option is instance-store. For more information, see Storage for the Root Device.
        public let defaultRootDeviceType: RootDeviceType?
        /// A default Amazon EC2 key pair name. The default value is none. If you specify a key pair name,  OpsWorks installs the public key on the instance and you can use the private key with an SSH client to log in to the instance. For more information, see  Using SSH to Communicate with an Instance and  Managing SSH Access. You can override this setting by specifying a different key pair, or no key pair, when you  create an instance.
        public let defaultSshKeyName: String?
        /// The stack's default VPC subnet ID. This parameter is required if you specify a value for the VpcId parameter. All instances are launched into this subnet unless you specify otherwise when you create the instance. If you also specify a value for DefaultAvailabilityZone, the subnet must be in that zone. For information on default values and when this parameter is required, see the VpcId parameter description.
        public let defaultSubnetId: String?
        /// The stack's host name theme, with spaces replaced by underscores. The theme is used to generate host names for the stack's instances. By default, HostnameTheme is set to Layer_Dependent, which creates host names by appending integers to the layer's short name. The other themes are:    Baked_Goods     Clouds     Europe_Cities     Fruits     Greek_Deities_and_Titans     Legendary_creatures_from_Japan     Planets_and_Moons     Roman_Deities     Scottish_Islands     US_Cities     Wild_Cats    To obtain a generated host name, call GetHostNameSuggestion, which returns a host name based on the current theme.
        public let hostnameTheme: String?
        /// The stack name. Stack names can be a maximum of 64 characters.
        public let name: String
        /// The stack's Amazon Web Services Region, such as ap-south-1. For more information about Amazon Web Services Regions, see Regions and Endpoints.  In the CLI, this API maps to the --stack-region parameter. If the --stack-region parameter and the CLI common parameter --region are set to the same value, the stack uses a regional endpoint. If the --stack-region parameter is not set, but the CLI --region parameter is, this also results in a stack with a regional endpoint. However, if the --region parameter is set to us-east-1, and the --stack-region parameter is set to one of the following, then the stack uses a legacy or classic region: us-west-1, us-west-2, sa-east-1, eu-central-1, eu-west-1, ap-northeast-1, ap-southeast-1, ap-southeast-2. In this case, the actual API endpoint of the stack is in us-east-1. Only the preceding regions are supported as classic regions in the us-east-1 API endpoint. Because it is a best practice to choose the regional endpoint that is closest to where you manage Amazon Web Services, we recommend that you use regional endpoints for new stacks. The CLI common --region parameter always specifies a regional API endpoint; it cannot be used to specify a classic OpsWorks Stacks region.
        public let region: String
        /// The stack's IAM role, which allows OpsWorks Stacks to work with Amazon Web Services resources on your behalf. You must set this parameter to the Amazon Resource Name (ARN) for an existing IAM role. For more information about IAM ARNs, see  Using Identifiers.
        public let serviceRoleArn: String
        /// Whether the stack uses custom cookbooks.
        public let useCustomCookbooks: Bool?
        /// Whether to associate the OpsWorks Stacks built-in security groups with the stack's layers. OpsWorks Stacks provides a standard set of built-in security groups, one for each layer, which are associated with layers by default. With UseOpsworksSecurityGroups you can instead provide your own custom security groups. UseOpsworksSecurityGroups has the following settings:    True - OpsWorks Stacks automatically associates the appropriate built-in security group with each  layer (default setting). You can associate additional security groups with a layer after you create it, but you cannot  delete the built-in security group.   False - OpsWorks Stacks does not associate built-in security groups with layers. You must create  appropriate EC2 security groups and associate a security group with each layer that you create. However, you can still  manually associate a built-in security group with a layer on creation; custom security groups are required only for those  layers that need custom settings.   For more information, see Create a New Stack.
        public let useOpsworksSecurityGroups: Bool?
        /// The ID of the VPC that the stack is to be launched into. The VPC must be in the stack's region. All instances are launched  into this VPC. You cannot change the ID later.   If your account supports EC2-Classic, the default value is no VPC.   If your account does not support EC2-Classic, the default value is the default VPC for the specified region.   If the VPC ID corresponds to a default VPC and you have specified either the DefaultAvailabilityZone or the DefaultSubnetId parameter only, OpsWorks Stacks infers the value of the  other parameter. If you specify neither parameter, OpsWorks Stacks sets these parameters to the first valid Availability Zone for the specified region and the corresponding default VPC subnet ID, respectively. If you specify a nondefault VPC ID, note the following:   It must belong to a VPC in your account that is in the specified region.   You must specify a value for DefaultSubnetId.   For more information about how to use OpsWorks Stacks with a VPC, see Running a Stack in a VPC. For more information about default VPC and EC2-Classic, see Supported Platforms.
        public let vpcId: String?

        @inlinable
        public init(agentVersion: String? = nil, attributes: [StackAttributesKeys: String]? = nil, chefConfiguration: ChefConfiguration? = nil, configurationManager: StackConfigurationManager? = nil, customCookbooksSource: Source? = nil, customJson: String? = nil, defaultAvailabilityZone: String? = nil, defaultInstanceProfileArn: String, defaultOs: String? = nil, defaultRootDeviceType: RootDeviceType? = nil, defaultSshKeyName: String? = nil, defaultSubnetId: String? = nil, hostnameTheme: String? = nil, name: String, region: String, serviceRoleArn: String, useCustomCookbooks: Bool? = nil, useOpsworksSecurityGroups: Bool? = nil, vpcId: String? = nil) {
            self.agentVersion = agentVersion
            self.attributes = attributes
            self.chefConfiguration = chefConfiguration
            self.configurationManager = configurationManager
            self.customCookbooksSource = customCookbooksSource
            self.customJson = customJson
            self.defaultAvailabilityZone = defaultAvailabilityZone
            self.defaultInstanceProfileArn = defaultInstanceProfileArn
            self.defaultOs = defaultOs
            self.defaultRootDeviceType = defaultRootDeviceType
            self.defaultSshKeyName = defaultSshKeyName
            self.defaultSubnetId = defaultSubnetId
            self.hostnameTheme = hostnameTheme
            self.name = name
            self.region = region
            self.serviceRoleArn = serviceRoleArn
            self.useCustomCookbooks = useCustomCookbooks
            self.useOpsworksSecurityGroups = useOpsworksSecurityGroups
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case attributes = "Attributes"
            case chefConfiguration = "ChefConfiguration"
            case configurationManager = "ConfigurationManager"
            case customCookbooksSource = "CustomCookbooksSource"
            case customJson = "CustomJson"
            case defaultAvailabilityZone = "DefaultAvailabilityZone"
            case defaultInstanceProfileArn = "DefaultInstanceProfileArn"
            case defaultOs = "DefaultOs"
            case defaultRootDeviceType = "DefaultRootDeviceType"
            case defaultSshKeyName = "DefaultSshKeyName"
            case defaultSubnetId = "DefaultSubnetId"
            case hostnameTheme = "HostnameTheme"
            case name = "Name"
            case region = "Region"
            case serviceRoleArn = "ServiceRoleArn"
            case useCustomCookbooks = "UseCustomCookbooks"
            case useOpsworksSecurityGroups = "UseOpsworksSecurityGroups"
            case vpcId = "VpcId"
        }
    }

    public struct CreateStackResult: AWSDecodableShape {
        /// The stack ID, which is an opaque string that you use to identify the stack when performing actions such as DescribeStacks.
        public let stackId: String?

        @inlinable
        public init(stackId: String? = nil) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct CreateUserProfileRequest: AWSEncodableShape {
        /// Whether users can specify their own SSH public key through the My Settings page. For more information, see Setting an IAM User's Public SSH Key.
        public let allowSelfManagement: Bool?
        /// The user's IAM ARN; this can also be a federated user's ARN.
        public let iamUserArn: String
        /// The user's public SSH key.
        public let sshPublicKey: String?
        /// The user's SSH user name. The allowable characters are [a-z], [A-Z], [0-9], '-', and '_'. If the specified name includes other punctuation marks, OpsWorks Stacks removes them. For example, my.name is changed to myname. If you do not specify an SSH user name, OpsWorks Stacks generates one from the IAM user name.
        public let sshUsername: String?

        @inlinable
        public init(allowSelfManagement: Bool? = nil, iamUserArn: String, sshPublicKey: String? = nil, sshUsername: String? = nil) {
            self.allowSelfManagement = allowSelfManagement
            self.iamUserArn = iamUserArn
            self.sshPublicKey = sshPublicKey
            self.sshUsername = sshUsername
        }

        private enum CodingKeys: String, CodingKey {
            case allowSelfManagement = "AllowSelfManagement"
            case iamUserArn = "IamUserArn"
            case sshPublicKey = "SshPublicKey"
            case sshUsername = "SshUsername"
        }
    }

    public struct CreateUserProfileResult: AWSDecodableShape {
        /// The user's IAM ARN.
        public let iamUserArn: String?

        @inlinable
        public init(iamUserArn: String? = nil) {
            self.iamUserArn = iamUserArn
        }

        private enum CodingKeys: String, CodingKey {
            case iamUserArn = "IamUserArn"
        }
    }

    public struct DataSource: AWSEncodableShape & AWSDecodableShape {
        /// The data source's ARN.
        public let arn: String?
        /// The database name.
        public let databaseName: String?
        /// The data source's type, AutoSelectOpsworksMysqlInstance, OpsworksMysqlInstance, RdsDbInstance, or None.
        public let type: String?

        @inlinable
        public init(arn: String? = nil, databaseName: String? = nil, type: String? = nil) {
            self.arn = arn
            self.databaseName = databaseName
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
            case databaseName = "DatabaseName"
            case type = "Type"
        }
    }

    public struct DeleteAppRequest: AWSEncodableShape {
        /// The app ID.
        public let appId: String

        @inlinable
        public init(appId: String) {
            self.appId = appId
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
        }
    }

    public struct DeleteInstanceRequest: AWSEncodableShape {
        /// Whether to delete the instance Elastic IP address.
        public let deleteElasticIp: Bool?
        /// Whether to delete the instance's Amazon EBS volumes.
        public let deleteVolumes: Bool?
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(deleteElasticIp: Bool? = nil, deleteVolumes: Bool? = nil, instanceId: String) {
            self.deleteElasticIp = deleteElasticIp
            self.deleteVolumes = deleteVolumes
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case deleteElasticIp = "DeleteElasticIp"
            case deleteVolumes = "DeleteVolumes"
            case instanceId = "InstanceId"
        }
    }

    public struct DeleteLayerRequest: AWSEncodableShape {
        /// The layer ID.
        public let layerId: String

        @inlinable
        public init(layerId: String) {
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case layerId = "LayerId"
        }
    }

    public struct DeleteStackRequest: AWSEncodableShape {
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(stackId: String) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct DeleteUserProfileRequest: AWSEncodableShape {
        /// The user's IAM ARN. This can also be a federated user's ARN.
        public let iamUserArn: String

        @inlinable
        public init(iamUserArn: String) {
            self.iamUserArn = iamUserArn
        }

        private enum CodingKeys: String, CodingKey {
            case iamUserArn = "IamUserArn"
        }
    }

    public struct Deployment: AWSDecodableShape {
        /// The app ID.
        public let appId: String?
        /// Used to specify a stack or deployment command.
        public let command: DeploymentCommand?
        /// A user-defined comment.
        public let comment: String?
        /// Date when the deployment completed.
        public let completedAt: String?
        /// Date when the deployment was created.
        public let createdAt: String?
        /// A string that contains user-defined custom JSON. It can be used to override the corresponding default stack configuration  attribute values for stack or to pass data to recipes. The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information on custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes.
        public let customJson: String?
        /// The deployment ID.
        public let deploymentId: String?
        /// The deployment duration.
        public let duration: Int?
        /// The user's IAM ARN.
        public let iamUserArn: String?
        /// The IDs of the target instances.
        public let instanceIds: [String]?
        /// The stack ID.
        public let stackId: String?
        /// The deployment status:   running   successful   failed
        public let status: String?

        @inlinable
        public init(appId: String? = nil, command: DeploymentCommand? = nil, comment: String? = nil, completedAt: String? = nil, createdAt: String? = nil, customJson: String? = nil, deploymentId: String? = nil, duration: Int? = nil, iamUserArn: String? = nil, instanceIds: [String]? = nil, stackId: String? = nil, status: String? = nil) {
            self.appId = appId
            self.command = command
            self.comment = comment
            self.completedAt = completedAt
            self.createdAt = createdAt
            self.customJson = customJson
            self.deploymentId = deploymentId
            self.duration = duration
            self.iamUserArn = iamUserArn
            self.instanceIds = instanceIds
            self.stackId = stackId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
            case command = "Command"
            case comment = "Comment"
            case completedAt = "CompletedAt"
            case createdAt = "CreatedAt"
            case customJson = "CustomJson"
            case deploymentId = "DeploymentId"
            case duration = "Duration"
            case iamUserArn = "IamUserArn"
            case instanceIds = "InstanceIds"
            case stackId = "StackId"
            case status = "Status"
        }
    }

    public struct DeploymentCommand: AWSEncodableShape & AWSDecodableShape {
        /// The arguments of those commands that take arguments. It should be set to a JSON object with the following format:  {"arg_name1" : ["value1", "value2", ...], "arg_name2" : ["value1", "value2", ...], ...}  The update_dependencies command takes two arguments:    upgrade_os_to - Specifies the Amazon Linux version that you want instances to run, such as Amazon Linux 2. You must also set the allow_reboot argument to true.    allow_reboot - Specifies whether to allow OpsWorks Stacks to reboot the instances if necessary, after installing the updates. This argument can be set to either true or false. The default value is false.   For example, to upgrade an instance to Amazon Linux 2018.03, set Args to the following.  { "upgrade_os_to":["Amazon Linux 2018.03"], "allow_reboot":["true"] }
        public let args: [String: [String]]?
        /// Specifies the operation. You can specify only one command. For stacks, the following commands are available:    execute_recipes: Execute one or more recipes. To specify the recipes, set an Args parameter named recipes to the list of recipes to be executed. For example, to execute phpapp::appsetup, set Args to {"recipes":["phpapp::appsetup"]}.    install_dependencies: Install the stack's dependencies.    update_custom_cookbooks: Update the stack's custom cookbooks.    update_dependencies: Update the stack's dependencies.    The update_dependencies and install_dependencies commands are supported only for Linux instances. You can run the commands successfully on Windows instances, but they do nothing.  For apps, the following commands are available:    deploy: Deploy an app. Ruby on Rails apps have an optional Args parameter named migrate. Set Args to {"migrate":["true"]} to migrate the database. The default setting is {"migrate":["false"]}.    rollback Roll the app back to the previous version. When you update an app, OpsWorks Stacks stores the previous version, up to a maximum of five versions. You can use this command to roll an app back as many as four versions.    start: Start the app's web or application server.    stop: Stop the app's web or application server.    restart: Restart the app's web or application server.    undeploy: Undeploy the app.
        public let name: DeploymentCommandName

        @inlinable
        public init(args: [String: [String]]? = nil, name: DeploymentCommandName) {
            self.args = args
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case args = "Args"
            case name = "Name"
        }
    }

    public struct DeregisterEcsClusterRequest: AWSEncodableShape {
        /// The cluster's Amazon Resource Number (ARN).
        public let ecsClusterArn: String

        @inlinable
        public init(ecsClusterArn: String) {
            self.ecsClusterArn = ecsClusterArn
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusterArn = "EcsClusterArn"
        }
    }

    public struct DeregisterElasticIpRequest: AWSEncodableShape {
        /// The Elastic IP address.
        public let elasticIp: String

        @inlinable
        public init(elasticIp: String) {
            self.elasticIp = elasticIp
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
        }
    }

    public struct DeregisterInstanceRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(instanceId: String) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct DeregisterRdsDbInstanceRequest: AWSEncodableShape {
        /// The Amazon RDS instance's ARN.
        public let rdsDbInstanceArn: String

        @inlinable
        public init(rdsDbInstanceArn: String) {
            self.rdsDbInstanceArn = rdsDbInstanceArn
        }

        private enum CodingKeys: String, CodingKey {
            case rdsDbInstanceArn = "RdsDbInstanceArn"
        }
    }

    public struct DeregisterVolumeRequest: AWSEncodableShape {
        /// The OpsWorks Stacks volume ID, which is the GUID that OpsWorks Stacks assigned to the instance  when you registered the volume with the stack, not the Amazon EC2 volume ID.
        public let volumeId: String

        @inlinable
        public init(volumeId: String) {
            self.volumeId = volumeId
        }

        private enum CodingKeys: String, CodingKey {
            case volumeId = "VolumeId"
        }
    }

    public struct DescribeAgentVersionsRequest: AWSEncodableShape {
        /// The configuration manager.
        public let configurationManager: StackConfigurationManager?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(configurationManager: StackConfigurationManager? = nil, stackId: String? = nil) {
            self.configurationManager = configurationManager
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case configurationManager = "ConfigurationManager"
            case stackId = "StackId"
        }
    }

    public struct DescribeAgentVersionsResult: AWSDecodableShape {
        /// The agent versions for the specified stack or configuration manager. Note that this value is the complete version number,  not the abbreviated number used by the console.
        public let agentVersions: [AgentVersion]?

        @inlinable
        public init(agentVersions: [AgentVersion]? = nil) {
            self.agentVersions = agentVersions
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersions = "AgentVersions"
        }
    }

    public struct DescribeAppsRequest: AWSEncodableShape {
        /// An array of app IDs for the apps to be described. If you use this parameter, DescribeApps returns a description of the specified apps. Otherwise, it returns a description of every app.
        public let appIds: [String]?
        /// The app stack ID. If you use this parameter, DescribeApps returns a description of the apps in the specified stack.
        public let stackId: String?

        @inlinable
        public init(appIds: [String]? = nil, stackId: String? = nil) {
            self.appIds = appIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case appIds = "AppIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeAppsResult: AWSDecodableShape {
        /// An array of App objects that describe the specified apps.
        public let apps: [App]?

        @inlinable
        public init(apps: [App]? = nil) {
            self.apps = apps
        }

        private enum CodingKeys: String, CodingKey {
            case apps = "Apps"
        }
    }

    public struct DescribeCommandsRequest: AWSEncodableShape {
        /// An array of command IDs. If you include this parameter, DescribeCommands returns a description of the specified commands. Otherwise, it returns a description of every command.
        public let commandIds: [String]?
        /// The deployment ID. If you include this parameter, DescribeCommands returns a description of the commands associated with the specified deployment.
        public let deploymentId: String?
        /// The instance ID. If you include this parameter, DescribeCommands returns a description of the commands associated with the specified instance.
        public let instanceId: String?

        @inlinable
        public init(commandIds: [String]? = nil, deploymentId: String? = nil, instanceId: String? = nil) {
            self.commandIds = commandIds
            self.deploymentId = deploymentId
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case commandIds = "CommandIds"
            case deploymentId = "DeploymentId"
            case instanceId = "InstanceId"
        }
    }

    public struct DescribeCommandsResult: AWSDecodableShape {
        /// An array of Command objects that describe each of the specified commands.
        public let commands: [Command]?

        @inlinable
        public init(commands: [Command]? = nil) {
            self.commands = commands
        }

        private enum CodingKeys: String, CodingKey {
            case commands = "Commands"
        }
    }

    public struct DescribeDeploymentsRequest: AWSEncodableShape {
        /// The app ID. If you include this parameter, the command returns a description of the commands associated with the specified app.
        public let appId: String?
        /// An array of deployment IDs to be described. If you include this parameter, the command returns a description of the specified deployments. Otherwise, it returns a description of every deployment.
        public let deploymentIds: [String]?
        /// The stack ID. If you include this parameter, the command returns a description of the commands associated with the specified stack.
        public let stackId: String?

        @inlinable
        public init(appId: String? = nil, deploymentIds: [String]? = nil, stackId: String? = nil) {
            self.appId = appId
            self.deploymentIds = deploymentIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
            case deploymentIds = "DeploymentIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeDeploymentsResult: AWSDecodableShape {
        /// An array of Deployment objects that describe the deployments.
        public let deployments: [Deployment]?

        @inlinable
        public init(deployments: [Deployment]? = nil) {
            self.deployments = deployments
        }

        private enum CodingKeys: String, CodingKey {
            case deployments = "Deployments"
        }
    }

    public struct DescribeEcsClustersRequest: AWSEncodableShape {
        /// A list of ARNs, one for each cluster to be described.
        public let ecsClusterArns: [String]?
        /// To receive a paginated response, use this parameter to specify the maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a NextToken value that you can assign to the NextToken request parameter to get the next set of results.
        public let maxResults: Int?
        /// If the previous paginated request did not return all of the remaining results, the response object'sNextToken parameter value is set to a token. To retrieve the next set of results, call DescribeEcsClusters again and assign that token to the request object's NextToken parameter. If there are no remaining results, the previous response object's NextToken parameter is set to null.
        public let nextToken: String?
        /// A stack ID. DescribeEcsClusters returns a description of the cluster that is registered with the stack.
        public let stackId: String?

        @inlinable
        public init(ecsClusterArns: [String]? = nil, maxResults: Int? = nil, nextToken: String? = nil, stackId: String? = nil) {
            self.ecsClusterArns = ecsClusterArns
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusterArns = "EcsClusterArns"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case stackId = "StackId"
        }
    }

    public struct DescribeEcsClustersResult: AWSDecodableShape {
        /// A list of EcsCluster objects containing the cluster descriptions.
        public let ecsClusters: [EcsCluster]?
        /// If a paginated request does not return all of the remaining results, this parameter is set to a token that you can assign to the request object's NextToken parameter to retrieve the next set of results. If the previous paginated request returned all of the remaining results, this parameter is set to null.
        public let nextToken: String?

        @inlinable
        public init(ecsClusters: [EcsCluster]? = nil, nextToken: String? = nil) {
            self.ecsClusters = ecsClusters
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusters = "EcsClusters"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeElasticIpsRequest: AWSEncodableShape {
        /// The instance ID. If you include this parameter, DescribeElasticIps returns a description of the Elastic IP addresses associated with the specified instance.
        public let instanceId: String?
        /// An array of Elastic IP addresses to be described. If you include this parameter, DescribeElasticIps returns a description of the specified Elastic IP addresses. Otherwise, it returns a description of every Elastic IP address.
        public let ips: [String]?
        /// A stack ID. If you include this parameter, DescribeElasticIps returns a description of the Elastic IP addresses that are registered with the specified stack.
        public let stackId: String?

        @inlinable
        public init(instanceId: String? = nil, ips: [String]? = nil, stackId: String? = nil) {
            self.instanceId = instanceId
            self.ips = ips
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case ips = "Ips"
            case stackId = "StackId"
        }
    }

    public struct DescribeElasticIpsResult: AWSDecodableShape {
        /// An ElasticIps object that describes the specified Elastic IP addresses.
        public let elasticIps: [ElasticIp]?

        @inlinable
        public init(elasticIps: [ElasticIp]? = nil) {
            self.elasticIps = elasticIps
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIps = "ElasticIps"
        }
    }

    public struct DescribeElasticLoadBalancersRequest: AWSEncodableShape {
        /// A list of layer IDs. The action describes the Elastic Load Balancing instances for the specified layers.
        public let layerIds: [String]?
        /// A stack ID. The action describes the stack's Elastic Load Balancing instances.
        public let stackId: String?

        @inlinable
        public init(layerIds: [String]? = nil, stackId: String? = nil) {
            self.layerIds = layerIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case layerIds = "LayerIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeElasticLoadBalancersResult: AWSDecodableShape {
        /// A list of ElasticLoadBalancer objects that describe the specified Elastic Load Balancing instances.
        public let elasticLoadBalancers: [ElasticLoadBalancer]?

        @inlinable
        public init(elasticLoadBalancers: [ElasticLoadBalancer]? = nil) {
            self.elasticLoadBalancers = elasticLoadBalancers
        }

        private enum CodingKeys: String, CodingKey {
            case elasticLoadBalancers = "ElasticLoadBalancers"
        }
    }

    public struct DescribeInstancesRequest: AWSEncodableShape {
        /// An array of instance IDs to be described. If you use this parameter, DescribeInstances returns a description of the specified instances. Otherwise, it returns a description of every instance.
        public let instanceIds: [String]?
        /// A layer ID. If you use this parameter, DescribeInstances returns descriptions of the instances associated with the specified layer.
        public let layerId: String?
        /// A stack ID. If you use this parameter, DescribeInstances returns descriptions of the instances associated with the specified stack.
        public let stackId: String?

        @inlinable
        public init(instanceIds: [String]? = nil, layerId: String? = nil, stackId: String? = nil) {
            self.instanceIds = instanceIds
            self.layerId = layerId
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceIds = "InstanceIds"
            case layerId = "LayerId"
            case stackId = "StackId"
        }
    }

    public struct DescribeInstancesResult: AWSDecodableShape {
        /// An array of Instance objects that describe the instances.
        public let instances: [Instance]?

        @inlinable
        public init(instances: [Instance]? = nil) {
            self.instances = instances
        }

        private enum CodingKeys: String, CodingKey {
            case instances = "Instances"
        }
    }

    public struct DescribeLayersRequest: AWSEncodableShape {
        /// An array of layer IDs that specify the layers to be described. If you omit this parameter, DescribeLayers returns a description of every layer in the specified stack.
        public let layerIds: [String]?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(layerIds: [String]? = nil, stackId: String? = nil) {
            self.layerIds = layerIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case layerIds = "LayerIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeLayersResult: AWSDecodableShape {
        /// An array of Layer objects that describe the layers.
        public let layers: [Layer]?

        @inlinable
        public init(layers: [Layer]? = nil) {
            self.layers = layers
        }

        private enum CodingKeys: String, CodingKey {
            case layers = "Layers"
        }
    }

    public struct DescribeLoadBasedAutoScalingRequest: AWSEncodableShape {
        /// An array of layer IDs.
        public let layerIds: [String]

        @inlinable
        public init(layerIds: [String]) {
            self.layerIds = layerIds
        }

        private enum CodingKeys: String, CodingKey {
            case layerIds = "LayerIds"
        }
    }

    public struct DescribeLoadBasedAutoScalingResult: AWSDecodableShape {
        /// An array of LoadBasedAutoScalingConfiguration objects that describe each layer's configuration.
        public let loadBasedAutoScalingConfigurations: [LoadBasedAutoScalingConfiguration]?

        @inlinable
        public init(loadBasedAutoScalingConfigurations: [LoadBasedAutoScalingConfiguration]? = nil) {
            self.loadBasedAutoScalingConfigurations = loadBasedAutoScalingConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case loadBasedAutoScalingConfigurations = "LoadBasedAutoScalingConfigurations"
        }
    }

    public struct DescribeMyUserProfileResult: AWSDecodableShape {
        /// A UserProfile object that describes the user's SSH information.
        public let userProfile: SelfUserProfile?

        @inlinable
        public init(userProfile: SelfUserProfile? = nil) {
            self.userProfile = userProfile
        }

        private enum CodingKeys: String, CodingKey {
            case userProfile = "UserProfile"
        }
    }

    public struct DescribeOperatingSystemsResponse: AWSDecodableShape {
        /// Contains information in response to a DescribeOperatingSystems request.
        public let operatingSystems: [OperatingSystem]?

        @inlinable
        public init(operatingSystems: [OperatingSystem]? = nil) {
            self.operatingSystems = operatingSystems
        }

        private enum CodingKeys: String, CodingKey {
            case operatingSystems = "OperatingSystems"
        }
    }

    public struct DescribePermissionsRequest: AWSEncodableShape {
        /// The user's IAM ARN. This can also be a federated user's ARN. For more information about IAM  ARNs, see Using Identifiers.
        public let iamUserArn: String?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(iamUserArn: String? = nil, stackId: String? = nil) {
            self.iamUserArn = iamUserArn
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case iamUserArn = "IamUserArn"
            case stackId = "StackId"
        }
    }

    public struct DescribePermissionsResult: AWSDecodableShape {
        /// An array of Permission objects that describe the stack permissions.   If the request object contains only a stack ID, the array contains a Permission object with permissions for each of the stack IAM ARNs.   If the request object contains only an IAM ARN, the array contains a Permission object with permissions for each of the user's stack IDs.   If the request contains a stack ID and an IAM ARN, the array contains a single Permission object with permissions for the specified stack and IAM ARN.
        public let permissions: [Permission]?

        @inlinable
        public init(permissions: [Permission]? = nil) {
            self.permissions = permissions
        }

        private enum CodingKeys: String, CodingKey {
            case permissions = "Permissions"
        }
    }

    public struct DescribeRaidArraysRequest: AWSEncodableShape {
        /// The instance ID. If you use this parameter, DescribeRaidArrays returns descriptions of the RAID arrays associated with the specified instance.
        public let instanceId: String?
        /// An array of RAID array IDs. If you use this parameter, DescribeRaidArrays returns descriptions of the specified arrays. Otherwise, it returns a description of every array.
        public let raidArrayIds: [String]?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(instanceId: String? = nil, raidArrayIds: [String]? = nil, stackId: String? = nil) {
            self.instanceId = instanceId
            self.raidArrayIds = raidArrayIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case raidArrayIds = "RaidArrayIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeRaidArraysResult: AWSDecodableShape {
        /// A RaidArrays object that describes the specified RAID arrays.
        public let raidArrays: [RaidArray]?

        @inlinable
        public init(raidArrays: [RaidArray]? = nil) {
            self.raidArrays = raidArrays
        }

        private enum CodingKeys: String, CodingKey {
            case raidArrays = "RaidArrays"
        }
    }

    public struct DescribeRdsDbInstancesRequest: AWSEncodableShape {
        /// An array containing the ARNs of the instances to be described.
        public let rdsDbInstanceArns: [String]?
        /// The ID of the stack with which the instances are registered. The operation returns descriptions of all registered  Amazon RDS instances.
        public let stackId: String

        @inlinable
        public init(rdsDbInstanceArns: [String]? = nil, stackId: String) {
            self.rdsDbInstanceArns = rdsDbInstanceArns
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case rdsDbInstanceArns = "RdsDbInstanceArns"
            case stackId = "StackId"
        }
    }

    public struct DescribeRdsDbInstancesResult: AWSDecodableShape {
        /// An a array of RdsDbInstance objects that describe the instances.
        public let rdsDbInstances: [RdsDbInstance]?

        @inlinable
        public init(rdsDbInstances: [RdsDbInstance]? = nil) {
            self.rdsDbInstances = rdsDbInstances
        }

        private enum CodingKeys: String, CodingKey {
            case rdsDbInstances = "RdsDbInstances"
        }
    }

    public struct DescribeServiceErrorsRequest: AWSEncodableShape {
        /// The instance ID. If you use this parameter, DescribeServiceErrors returns descriptions of the errors associated with the specified instance.
        public let instanceId: String?
        /// An array of service error IDs. If you use this parameter, DescribeServiceErrors returns descriptions of the specified errors. Otherwise, it returns a description of every error.
        public let serviceErrorIds: [String]?
        /// The stack ID. If you use this parameter, DescribeServiceErrors returns descriptions of the errors associated with the specified stack.
        public let stackId: String?

        @inlinable
        public init(instanceId: String? = nil, serviceErrorIds: [String]? = nil, stackId: String? = nil) {
            self.instanceId = instanceId
            self.serviceErrorIds = serviceErrorIds
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case serviceErrorIds = "ServiceErrorIds"
            case stackId = "StackId"
        }
    }

    public struct DescribeServiceErrorsResult: AWSDecodableShape {
        /// An array of ServiceError objects that describe the specified service errors.
        public let serviceErrors: [ServiceError]?

        @inlinable
        public init(serviceErrors: [ServiceError]? = nil) {
            self.serviceErrors = serviceErrors
        }

        private enum CodingKeys: String, CodingKey {
            case serviceErrors = "ServiceErrors"
        }
    }

    public struct DescribeStackProvisioningParametersRequest: AWSEncodableShape {
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(stackId: String) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct DescribeStackProvisioningParametersResult: AWSDecodableShape {
        /// The OpsWorks Stacks agent installer's URL.
        public let agentInstallerUrl: String?
        /// An embedded object that contains the provisioning parameters.
        public let parameters: [String: String]?

        @inlinable
        public init(agentInstallerUrl: String? = nil, parameters: [String: String]? = nil) {
            self.agentInstallerUrl = agentInstallerUrl
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case agentInstallerUrl = "AgentInstallerUrl"
            case parameters = "Parameters"
        }
    }

    public struct DescribeStackSummaryRequest: AWSEncodableShape {
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(stackId: String) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct DescribeStackSummaryResult: AWSDecodableShape {
        /// A StackSummary object that contains the results.
        public let stackSummary: StackSummary?

        @inlinable
        public init(stackSummary: StackSummary? = nil) {
            self.stackSummary = stackSummary
        }

        private enum CodingKeys: String, CodingKey {
            case stackSummary = "StackSummary"
        }
    }

    public struct DescribeStacksRequest: AWSEncodableShape {
        /// An array of stack IDs that specify the stacks to be described. If you omit this parameter, and have permissions to get information  about all stacks, DescribeStacks returns a description of every stack. If the IAM policy that is attached to an IAM  user limits the DescribeStacks action to specific stack ARNs, this parameter is required, and the user must specify a stack ARN that is allowed by the policy.  Otherwise, DescribeStacks returns an AccessDenied error.
        public let stackIds: [String]?

        @inlinable
        public init(stackIds: [String]? = nil) {
            self.stackIds = stackIds
        }

        private enum CodingKeys: String, CodingKey {
            case stackIds = "StackIds"
        }
    }

    public struct DescribeStacksResult: AWSDecodableShape {
        /// An array of Stack objects that describe the stacks.
        public let stacks: [Stack]?

        @inlinable
        public init(stacks: [Stack]? = nil) {
            self.stacks = stacks
        }

        private enum CodingKeys: String, CodingKey {
            case stacks = "Stacks"
        }
    }

    public struct DescribeTimeBasedAutoScalingRequest: AWSEncodableShape {
        /// An array of instance IDs.
        public let instanceIds: [String]

        @inlinable
        public init(instanceIds: [String]) {
            self.instanceIds = instanceIds
        }

        private enum CodingKeys: String, CodingKey {
            case instanceIds = "InstanceIds"
        }
    }

    public struct DescribeTimeBasedAutoScalingResult: AWSDecodableShape {
        /// An array of TimeBasedAutoScalingConfiguration objects that describe the configuration for the specified instances.
        public let timeBasedAutoScalingConfigurations: [TimeBasedAutoScalingConfiguration]?

        @inlinable
        public init(timeBasedAutoScalingConfigurations: [TimeBasedAutoScalingConfiguration]? = nil) {
            self.timeBasedAutoScalingConfigurations = timeBasedAutoScalingConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case timeBasedAutoScalingConfigurations = "TimeBasedAutoScalingConfigurations"
        }
    }

    public struct DescribeUserProfilesRequest: AWSEncodableShape {
        /// An array of IAM or federated user ARNs that identify the users to be described.
        public let iamUserArns: [String]?

        @inlinable
        public init(iamUserArns: [String]? = nil) {
            self.iamUserArns = iamUserArns
        }

        private enum CodingKeys: String, CodingKey {
            case iamUserArns = "IamUserArns"
        }
    }

    public struct DescribeUserProfilesResult: AWSDecodableShape {
        /// A Users object that describes the specified users.
        public let userProfiles: [UserProfile]?

        @inlinable
        public init(userProfiles: [UserProfile]? = nil) {
            self.userProfiles = userProfiles
        }

        private enum CodingKeys: String, CodingKey {
            case userProfiles = "UserProfiles"
        }
    }

    public struct DescribeVolumesRequest: AWSEncodableShape {
        /// The instance ID. If you use this parameter, DescribeVolumes returns descriptions of the volumes associated with the specified instance.
        public let instanceId: String?
        /// The RAID array ID. If you use this parameter, DescribeVolumes returns descriptions of the volumes associated with the specified RAID array.
        public let raidArrayId: String?
        /// A stack ID. The action describes the stack's registered Amazon EBS volumes.
        public let stackId: String?
        /// Am array of volume IDs. If you use this parameter, DescribeVolumes returns descriptions of the specified volumes. Otherwise, it returns a description of every volume.
        public let volumeIds: [String]?

        @inlinable
        public init(instanceId: String? = nil, raidArrayId: String? = nil, stackId: String? = nil, volumeIds: [String]? = nil) {
            self.instanceId = instanceId
            self.raidArrayId = raidArrayId
            self.stackId = stackId
            self.volumeIds = volumeIds
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case raidArrayId = "RaidArrayId"
            case stackId = "StackId"
            case volumeIds = "VolumeIds"
        }
    }

    public struct DescribeVolumesResult: AWSDecodableShape {
        /// An array of volume IDs.
        public let volumes: [Volume]?

        @inlinable
        public init(volumes: [Volume]? = nil) {
            self.volumes = volumes
        }

        private enum CodingKeys: String, CodingKey {
            case volumes = "Volumes"
        }
    }

    public struct DetachElasticLoadBalancerRequest: AWSEncodableShape {
        /// The Elastic Load Balancing instance's name.
        public let elasticLoadBalancerName: String
        /// The ID of the layer that the Elastic Load Balancing instance is attached to.
        public let layerId: String

        @inlinable
        public init(elasticLoadBalancerName: String, layerId: String) {
            self.elasticLoadBalancerName = elasticLoadBalancerName
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case elasticLoadBalancerName = "ElasticLoadBalancerName"
            case layerId = "LayerId"
        }
    }

    public struct DisassociateElasticIpRequest: AWSEncodableShape {
        /// The Elastic IP address.
        public let elasticIp: String

        @inlinable
        public init(elasticIp: String) {
            self.elasticIp = elasticIp
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
        }
    }

    public struct EbsBlockDevice: AWSEncodableShape & AWSDecodableShape {
        /// Whether the volume is deleted on instance termination.
        public let deleteOnTermination: Bool?
        /// The number of I/O operations per second (IOPS) that the volume supports. For more information, see EbsBlockDevice.
        public let iops: Int?
        /// The snapshot ID.
        public let snapshotId: String?
        /// The volume size, in GiB. For more information, see EbsBlockDevice.
        public let volumeSize: Int?
        /// The volume type. gp2 for General Purpose (SSD) volumes, io1 for Provisioned IOPS (SSD) volumes, st1 for Throughput Optimized hard disk drives (HDD), sc1 for Cold HDD,and standard for Magnetic volumes. If you specify the io1 volume type, you must also specify a value for the Iops attribute.  The maximum ratio of provisioned IOPS to requested volume size (in GiB) is 50:1. Amazon Web Services uses the default volume size (in GiB)  specified in the AMI attributes to set IOPS to 50 x (volume size).
        public let volumeType: VolumeType?

        @inlinable
        public init(deleteOnTermination: Bool? = nil, iops: Int? = nil, snapshotId: String? = nil, volumeSize: Int? = nil, volumeType: VolumeType? = nil) {
            self.deleteOnTermination = deleteOnTermination
            self.iops = iops
            self.snapshotId = snapshotId
            self.volumeSize = volumeSize
            self.volumeType = volumeType
        }

        private enum CodingKeys: String, CodingKey {
            case deleteOnTermination = "DeleteOnTermination"
            case iops = "Iops"
            case snapshotId = "SnapshotId"
            case volumeSize = "VolumeSize"
            case volumeType = "VolumeType"
        }
    }

    public struct EcsCluster: AWSDecodableShape {
        /// The cluster's ARN.
        public let ecsClusterArn: String?
        /// The cluster name.
        public let ecsClusterName: String?
        /// The time and date that the cluster was registered with the stack.
        public let registeredAt: String?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(ecsClusterArn: String? = nil, ecsClusterName: String? = nil, registeredAt: String? = nil, stackId: String? = nil) {
            self.ecsClusterArn = ecsClusterArn
            self.ecsClusterName = ecsClusterName
            self.registeredAt = registeredAt
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusterArn = "EcsClusterArn"
            case ecsClusterName = "EcsClusterName"
            case registeredAt = "RegisteredAt"
            case stackId = "StackId"
        }
    }

    public struct ElasticIp: AWSDecodableShape {
        /// The domain.
        public let domain: String?
        /// The ID of the instance that the address is attached to.
        public let instanceId: String?
        /// The IP address.
        public let ip: String?
        /// The name, which can be a maximum of 32 characters.
        public let name: String?
        /// The Amazon Web Services Region. For more information, see Regions and Endpoints.
        public let region: String?

        @inlinable
        public init(domain: String? = nil, instanceId: String? = nil, ip: String? = nil, name: String? = nil, region: String? = nil) {
            self.domain = domain
            self.instanceId = instanceId
            self.ip = ip
            self.name = name
            self.region = region
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case instanceId = "InstanceId"
            case ip = "Ip"
            case name = "Name"
            case region = "Region"
        }
    }

    public struct ElasticLoadBalancer: AWSDecodableShape {
        /// A list of Availability Zones.
        public let availabilityZones: [String]?
        /// The instance's public DNS name.
        public let dnsName: String?
        /// A list of the EC2 instances for which the Elastic Load Balancing instance is managing traffic.
        public let ec2InstanceIds: [String]?
        /// The Elastic Load Balancing instance name.
        public let elasticLoadBalancerName: String?
        /// The ID of the layer to which the instance is attached.
        public let layerId: String?
        /// The instance's Amazon Web Services Region.
        public let region: String?
        /// The ID of the stack with which the instance is associated.
        public let stackId: String?
        /// A list of subnet IDs, if the stack is running in a VPC.
        public let subnetIds: [String]?
        /// The VPC ID.
        public let vpcId: String?

        @inlinable
        public init(availabilityZones: [String]? = nil, dnsName: String? = nil, ec2InstanceIds: [String]? = nil, elasticLoadBalancerName: String? = nil, layerId: String? = nil, region: String? = nil, stackId: String? = nil, subnetIds: [String]? = nil, vpcId: String? = nil) {
            self.availabilityZones = availabilityZones
            self.dnsName = dnsName
            self.ec2InstanceIds = ec2InstanceIds
            self.elasticLoadBalancerName = elasticLoadBalancerName
            self.layerId = layerId
            self.region = region
            self.stackId = stackId
            self.subnetIds = subnetIds
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case dnsName = "DnsName"
            case ec2InstanceIds = "Ec2InstanceIds"
            case elasticLoadBalancerName = "ElasticLoadBalancerName"
            case layerId = "LayerId"
            case region = "Region"
            case stackId = "StackId"
            case subnetIds = "SubnetIds"
            case vpcId = "VpcId"
        }
    }

    public struct EnvironmentVariable: AWSEncodableShape & AWSDecodableShape {
        /// (Required) The environment variable's name, which can consist of up to 64 characters and must be specified.  The name can contain upper- and lowercase letters, numbers, and underscores (_), but it must start with a letter or underscore.
        public let key: String
        /// (Optional) Whether the variable's value is returned by the DescribeApps action. To hide an environment variable's value, set Secure to true. DescribeApps returns *****FILTERED***** instead of the actual value. The default value for Secure is false.
        public let secure: Bool?
        /// (Optional) The environment variable's value, which can be left empty. If you specify a value,  it can contain up to 256 characters, which must all be printable.
        public let value: String

        @inlinable
        public init(key: String, secure: Bool? = nil, value: String) {
            self.key = key
            self.secure = secure
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case secure = "Secure"
            case value = "Value"
        }
    }

    public struct GetHostnameSuggestionRequest: AWSEncodableShape {
        /// The layer ID.
        public let layerId: String

        @inlinable
        public init(layerId: String) {
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case layerId = "LayerId"
        }
    }

    public struct GetHostnameSuggestionResult: AWSDecodableShape {
        /// The generated host name.
        public let hostname: String?
        /// The layer ID.
        public let layerId: String?

        @inlinable
        public init(hostname: String? = nil, layerId: String? = nil) {
            self.hostname = hostname
            self.layerId = layerId
        }

        private enum CodingKeys: String, CodingKey {
            case hostname = "Hostname"
            case layerId = "LayerId"
        }
    }

    public struct GrantAccessRequest: AWSEncodableShape {
        /// The instance's OpsWorks Stacks ID.
        public let instanceId: String
        /// The length of time (in minutes) that the grant is valid. When the grant expires at the end of this period,  the user will no longer be able to use the credentials to log in. If the user is logged in at the time, they are  logged out.
        public let validForInMinutes: Int?

        @inlinable
        public init(instanceId: String, validForInMinutes: Int? = nil) {
            self.instanceId = instanceId
            self.validForInMinutes = validForInMinutes
        }

        public func validate(name: String) throws {
            try self.validate(self.validForInMinutes, name: "validForInMinutes", parent: name, max: 1440)
            try self.validate(self.validForInMinutes, name: "validForInMinutes", parent: name, min: 60)
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case validForInMinutes = "ValidForInMinutes"
        }
    }

    public struct GrantAccessResult: AWSDecodableShape {
        /// A TemporaryCredential object that contains the data needed to log in to the instance by RDP clients, such as the Microsoft Remote Desktop Connection.
        public let temporaryCredential: TemporaryCredential?

        @inlinable
        public init(temporaryCredential: TemporaryCredential? = nil) {
            self.temporaryCredential = temporaryCredential
        }

        private enum CodingKeys: String, CodingKey {
            case temporaryCredential = "TemporaryCredential"
        }
    }

    public struct Instance: AWSDecodableShape {
        /// The agent version. This parameter is set to INHERIT if the instance inherits the default stack setting or to a a version number for a fixed agent version.
        public let agentVersion: String?
        /// A custom AMI ID to be used to create the instance. For more information, see Instances
        public let amiId: String?
        /// The instance architecture: "i386" or "x86_64".
        public let architecture: Architecture?
        /// The instance's Amazon Resource Number (ARN).
        public let arn: String?
        /// For load-based or time-based instances, the type.
        public let autoScalingType: AutoScalingType?
        /// The instance Availability Zone. For more information, see Regions and Endpoints.
        public let availabilityZone: String?
        /// An array of BlockDeviceMapping objects that specify the instance's block device mappings.
        public let blockDeviceMappings: [BlockDeviceMapping]?
        /// The time that the instance was created.
        public let createdAt: String?
        /// Whether this is an Amazon EBS-optimized instance.
        public let ebsOptimized: Bool?
        /// The ID of the associated Amazon EC2 instance.
        public let ec2InstanceId: String?
        /// For container instances, the Amazon ECS cluster's ARN.
        public let ecsClusterArn: String?
        /// For container instances, the instance's ARN.
        public let ecsContainerInstanceArn: String?
        /// The instance Elastic IP address.
        public let elasticIp: String?
        /// The instance host name. The following are character limits for instance host names.   Linux-based instances: 63 characters   Windows-based instances: 15 characters
        public let hostname: String?
        /// For registered instances, the infrastructure class: ec2 or on-premises.
        public let infrastructureClass: String?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. If this value is set to false, you must update instances manually by using CreateDeployment to run the update_dependencies stack command or by manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We strongly recommend using the default value of true to ensure that your instances have the latest security updates.
        public let installUpdatesOnBoot: Bool?
        /// The instance ID.
        public let instanceId: String?
        /// The ARN of the instance's IAM profile. For more information about IAM ARNs,  see Using Identifiers.
        public let instanceProfileArn: String?
        /// The instance type, such as t2.micro.
        public let instanceType: String?
        /// The ID of the last service error. For more information, call DescribeServiceErrors.
        public let lastServiceErrorId: String?
        /// An array containing the instance layer IDs.
        public let layerIds: [String]?
        /// The instance's operating system.
        public let os: String?
        /// The instance's platform.
        public let platform: String?
        /// The instance's private DNS name.
        public let privateDns: String?
        /// The instance's private IP address.
        public let privateIp: String?
        /// The instance public DNS name.
        public let publicDns: String?
        /// The instance public IP address.
        public let publicIp: String?
        /// For registered instances, who performed the registration.
        public let registeredBy: String?
        /// The instance's reported OpsWorks Stacks agent version.
        public let reportedAgentVersion: String?
        /// For registered instances, the reported operating system.
        public let reportedOs: ReportedOs?
        /// The instance's root device type. For more information, see Storage for the Root Device.
        public let rootDeviceType: RootDeviceType?
        /// The root device volume ID.
        public let rootDeviceVolumeId: String?
        /// An array containing the instance security group IDs.
        public let securityGroupIds: [String]?
        /// The SSH key's Deep Security Agent (DSA) fingerprint.
        public let sshHostDsaKeyFingerprint: String?
        /// The SSH key's RSA fingerprint.
        public let sshHostRsaKeyFingerprint: String?
        /// The instance's Amazon EC2 key-pair name.
        public let sshKeyName: String?
        /// The stack ID.
        public let stackId: String?
        /// The instance status:    booting     connection_lost     online     pending     rebooting     requested     running_setup     setup_failed     shutting_down     start_failed     stop_failed     stopped     stopping     terminated     terminating
        public let status: String?
        /// The instance's subnet ID; applicable only if the stack is running in a VPC.
        public let subnetId: String?
        /// The instance's tenancy option, such as dedicated or host.
        public let tenancy: String?
        /// The instance's virtualization type: paravirtual or hvm.
        public let virtualizationType: VirtualizationType?

        @inlinable
        public init(agentVersion: String? = nil, amiId: String? = nil, architecture: Architecture? = nil, arn: String? = nil, autoScalingType: AutoScalingType? = nil, availabilityZone: String? = nil, blockDeviceMappings: [BlockDeviceMapping]? = nil, createdAt: String? = nil, ebsOptimized: Bool? = nil, ec2InstanceId: String? = nil, ecsClusterArn: String? = nil, ecsContainerInstanceArn: String? = nil, elasticIp: String? = nil, hostname: String? = nil, infrastructureClass: String? = nil, installUpdatesOnBoot: Bool? = nil, instanceId: String? = nil, instanceProfileArn: String? = nil, instanceType: String? = nil, lastServiceErrorId: String? = nil, layerIds: [String]? = nil, os: String? = nil, platform: String? = nil, privateDns: String? = nil, privateIp: String? = nil, publicDns: String? = nil, publicIp: String? = nil, registeredBy: String? = nil, reportedAgentVersion: String? = nil, reportedOs: ReportedOs? = nil, rootDeviceType: RootDeviceType? = nil, rootDeviceVolumeId: String? = nil, securityGroupIds: [String]? = nil, sshHostDsaKeyFingerprint: String? = nil, sshHostRsaKeyFingerprint: String? = nil, sshKeyName: String? = nil, stackId: String? = nil, status: String? = nil, subnetId: String? = nil, tenancy: String? = nil, virtualizationType: VirtualizationType? = nil) {
            self.agentVersion = agentVersion
            self.amiId = amiId
            self.architecture = architecture
            self.arn = arn
            self.autoScalingType = autoScalingType
            self.availabilityZone = availabilityZone
            self.blockDeviceMappings = blockDeviceMappings
            self.createdAt = createdAt
            self.ebsOptimized = ebsOptimized
            self.ec2InstanceId = ec2InstanceId
            self.ecsClusterArn = ecsClusterArn
            self.ecsContainerInstanceArn = ecsContainerInstanceArn
            self.elasticIp = elasticIp
            self.hostname = hostname
            self.infrastructureClass = infrastructureClass
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.instanceId = instanceId
            self.instanceProfileArn = instanceProfileArn
            self.instanceType = instanceType
            self.lastServiceErrorId = lastServiceErrorId
            self.layerIds = layerIds
            self.os = os
            self.platform = platform
            self.privateDns = privateDns
            self.privateIp = privateIp
            self.publicDns = publicDns
            self.publicIp = publicIp
            self.registeredBy = registeredBy
            self.reportedAgentVersion = reportedAgentVersion
            self.reportedOs = reportedOs
            self.rootDeviceType = rootDeviceType
            self.rootDeviceVolumeId = rootDeviceVolumeId
            self.securityGroupIds = securityGroupIds
            self.sshHostDsaKeyFingerprint = sshHostDsaKeyFingerprint
            self.sshHostRsaKeyFingerprint = sshHostRsaKeyFingerprint
            self.sshKeyName = sshKeyName
            self.stackId = stackId
            self.status = status
            self.subnetId = subnetId
            self.tenancy = tenancy
            self.virtualizationType = virtualizationType
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case amiId = "AmiId"
            case architecture = "Architecture"
            case arn = "Arn"
            case autoScalingType = "AutoScalingType"
            case availabilityZone = "AvailabilityZone"
            case blockDeviceMappings = "BlockDeviceMappings"
            case createdAt = "CreatedAt"
            case ebsOptimized = "EbsOptimized"
            case ec2InstanceId = "Ec2InstanceId"
            case ecsClusterArn = "EcsClusterArn"
            case ecsContainerInstanceArn = "EcsContainerInstanceArn"
            case elasticIp = "ElasticIp"
            case hostname = "Hostname"
            case infrastructureClass = "InfrastructureClass"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case instanceId = "InstanceId"
            case instanceProfileArn = "InstanceProfileArn"
            case instanceType = "InstanceType"
            case lastServiceErrorId = "LastServiceErrorId"
            case layerIds = "LayerIds"
            case os = "Os"
            case platform = "Platform"
            case privateDns = "PrivateDns"
            case privateIp = "PrivateIp"
            case publicDns = "PublicDns"
            case publicIp = "PublicIp"
            case registeredBy = "RegisteredBy"
            case reportedAgentVersion = "ReportedAgentVersion"
            case reportedOs = "ReportedOs"
            case rootDeviceType = "RootDeviceType"
            case rootDeviceVolumeId = "RootDeviceVolumeId"
            case securityGroupIds = "SecurityGroupIds"
            case sshHostDsaKeyFingerprint = "SshHostDsaKeyFingerprint"
            case sshHostRsaKeyFingerprint = "SshHostRsaKeyFingerprint"
            case sshKeyName = "SshKeyName"
            case stackId = "StackId"
            case status = "Status"
            case subnetId = "SubnetId"
            case tenancy = "Tenancy"
            case virtualizationType = "VirtualizationType"
        }
    }

    public struct InstanceIdentity: AWSEncodableShape {
        /// A JSON document that contains the metadata.
        public let document: String?
        /// A signature that can be used to verify the document's accuracy and authenticity.
        public let signature: String?

        @inlinable
        public init(document: String? = nil, signature: String? = nil) {
            self.document = document
            self.signature = signature
        }

        private enum CodingKeys: String, CodingKey {
            case document = "Document"
            case signature = "Signature"
        }
    }

    public struct InstancesCount: AWSDecodableShape {
        /// The number of instances in the Assigning state.
        public let assigning: Int?
        /// The number of instances with booting status.
        public let booting: Int?
        /// The number of instances with connection_lost status.
        public let connectionLost: Int?
        /// The number of instances in the Deregistering state.
        public let deregistering: Int?
        /// The number of instances with online status.
        public let online: Int?
        /// The number of instances with pending status.
        public let pending: Int?
        /// The number of instances with rebooting status.
        public let rebooting: Int?
        /// The number of instances in the Registered state.
        public let registered: Int?
        /// The number of instances in the Registering state.
        public let registering: Int?
        /// The number of instances with requested status.
        public let requested: Int?
        /// The number of instances with running_setup status.
        public let runningSetup: Int?
        /// The number of instances with setup_failed status.
        public let setupFailed: Int?
        /// The number of instances with shutting_down status.
        public let shuttingDown: Int?
        /// The number of instances with start_failed status.
        public let startFailed: Int?
        /// The number of instances with stop_failed status.
        public let stopFailed: Int?
        /// The number of instances with stopped status.
        public let stopped: Int?
        /// The number of instances with stopping status.
        public let stopping: Int?
        /// The number of instances with terminated status.
        public let terminated: Int?
        /// The number of instances with terminating status.
        public let terminating: Int?
        /// The number of instances in the Unassigning state.
        public let unassigning: Int?

        @inlinable
        public init(assigning: Int? = nil, booting: Int? = nil, connectionLost: Int? = nil, deregistering: Int? = nil, online: Int? = nil, pending: Int? = nil, rebooting: Int? = nil, registered: Int? = nil, registering: Int? = nil, requested: Int? = nil, runningSetup: Int? = nil, setupFailed: Int? = nil, shuttingDown: Int? = nil, startFailed: Int? = nil, stopFailed: Int? = nil, stopped: Int? = nil, stopping: Int? = nil, terminated: Int? = nil, terminating: Int? = nil, unassigning: Int? = nil) {
            self.assigning = assigning
            self.booting = booting
            self.connectionLost = connectionLost
            self.deregistering = deregistering
            self.online = online
            self.pending = pending
            self.rebooting = rebooting
            self.registered = registered
            self.registering = registering
            self.requested = requested
            self.runningSetup = runningSetup
            self.setupFailed = setupFailed
            self.shuttingDown = shuttingDown
            self.startFailed = startFailed
            self.stopFailed = stopFailed
            self.stopped = stopped
            self.stopping = stopping
            self.terminated = terminated
            self.terminating = terminating
            self.unassigning = unassigning
        }

        private enum CodingKeys: String, CodingKey {
            case assigning = "Assigning"
            case booting = "Booting"
            case connectionLost = "ConnectionLost"
            case deregistering = "Deregistering"
            case online = "Online"
            case pending = "Pending"
            case rebooting = "Rebooting"
            case registered = "Registered"
            case registering = "Registering"
            case requested = "Requested"
            case runningSetup = "RunningSetup"
            case setupFailed = "SetupFailed"
            case shuttingDown = "ShuttingDown"
            case startFailed = "StartFailed"
            case stopFailed = "StopFailed"
            case stopped = "Stopped"
            case stopping = "Stopping"
            case terminated = "Terminated"
            case terminating = "Terminating"
            case unassigning = "Unassigning"
        }
    }

    public struct Layer: AWSDecodableShape {
        /// The Amazon Resource Number (ARN) of a layer.
        public let arn: String?
        /// The layer attributes. For the HaproxyStatsPassword, MysqlRootPassword, and GangliaPassword attributes, OpsWorks Stacks returns *****FILTERED***** instead of the actual value For an ECS Cluster layer, OpsWorks Stacks the EcsClusterArn attribute is set to the cluster's ARN.
        public let attributes: [LayerAttributesKeys: String]?
        /// Whether to automatically assign an Elastic IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignElasticIps: Bool?
        /// For stacks that are running in a VPC, whether to automatically assign a public IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignPublicIps: Bool?
        /// The Amazon CloudWatch Logs configuration settings for the layer.
        public let cloudWatchLogsConfiguration: CloudWatchLogsConfiguration?
        /// Date when the layer was created.
        public let createdAt: String?
        /// The ARN of the default IAM profile to be used for the layer's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let customInstanceProfileArn: String?
        /// A JSON formatted string containing the layer's custom stack configuration and deployment attributes.
        public let customJson: String?
        /// A LayerCustomRecipes object that specifies the layer's custom recipes.
        public let customRecipes: Recipes?
        /// An array containing the layer's custom security group IDs.
        public let customSecurityGroupIds: [String]?
        /// OpsWorks Stacks supports five lifecycle events: setup, configuration,  deploy, undeploy, and shutdown. For each layer, OpsWorks Stacks runs a set of standard recipes for each event. You can also provide  custom recipes for any or all layers and events. OpsWorks Stacks runs custom event recipes after the standard  recipes. LayerCustomRecipes specifies the custom recipes for a particular layer to be run in response to each of  the five events. To specify a recipe, use the cookbook's directory name in the repository followed by two colons and the recipe  name, which is the recipe's file name without the .rb extension. For example: phpapp2::dbsetup specifies the  dbsetup.rb recipe in the repository's phpapp2 folder.
        public let defaultRecipes: Recipes?
        /// An array containing the layer's security group names.
        public let defaultSecurityGroupNames: [String]?
        /// Whether auto healing is disabled for the layer.
        public let enableAutoHealing: Bool?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. If this value is set to false, you must then update your instances manually by using CreateDeployment to run the update_dependencies stack command or manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We strongly recommend using the default value of true, to ensure that your instances have the latest security updates.
        public let installUpdatesOnBoot: Bool?
        /// The layer ID.
        public let layerId: String?
        /// A LifeCycleEventConfiguration object that specifies the Shutdown event configuration.
        public let lifecycleEventConfiguration: LifecycleEventConfiguration?
        /// The layer name. Layer names can be a maximum of 32 characters.
        public let name: String?
        /// An array of Package objects that describe the layer's packages.
        public let packages: [String]?
        /// The layer short name.
        public let shortname: String?
        /// The layer stack ID.
        public let stackId: String?
        /// The layer type.
        public let type: LayerType?
        /// Whether the layer uses Amazon EBS-optimized instances.
        public let useEbsOptimizedInstances: Bool?
        /// A VolumeConfigurations object that describes the layer's Amazon EBS volumes.
        public let volumeConfigurations: [VolumeConfiguration]?

        @inlinable
        public init(arn: String? = nil, attributes: [LayerAttributesKeys: String]? = nil, autoAssignElasticIps: Bool? = nil, autoAssignPublicIps: Bool? = nil, cloudWatchLogsConfiguration: CloudWatchLogsConfiguration? = nil, createdAt: String? = nil, customInstanceProfileArn: String? = nil, customJson: String? = nil, customRecipes: Recipes? = nil, customSecurityGroupIds: [String]? = nil, defaultRecipes: Recipes? = nil, defaultSecurityGroupNames: [String]? = nil, enableAutoHealing: Bool? = nil, installUpdatesOnBoot: Bool? = nil, layerId: String? = nil, lifecycleEventConfiguration: LifecycleEventConfiguration? = nil, name: String? = nil, packages: [String]? = nil, shortname: String? = nil, stackId: String? = nil, type: LayerType? = nil, useEbsOptimizedInstances: Bool? = nil, volumeConfigurations: [VolumeConfiguration]? = nil) {
            self.arn = arn
            self.attributes = attributes
            self.autoAssignElasticIps = autoAssignElasticIps
            self.autoAssignPublicIps = autoAssignPublicIps
            self.cloudWatchLogsConfiguration = cloudWatchLogsConfiguration
            self.createdAt = createdAt
            self.customInstanceProfileArn = customInstanceProfileArn
            self.customJson = customJson
            self.customRecipes = customRecipes
            self.customSecurityGroupIds = customSecurityGroupIds
            self.defaultRecipes = defaultRecipes
            self.defaultSecurityGroupNames = defaultSecurityGroupNames
            self.enableAutoHealing = enableAutoHealing
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.layerId = layerId
            self.lifecycleEventConfiguration = lifecycleEventConfiguration
            self.name = name
            self.packages = packages
            self.shortname = shortname
            self.stackId = stackId
            self.type = type
            self.useEbsOptimizedInstances = useEbsOptimizedInstances
            self.volumeConfigurations = volumeConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
            case attributes = "Attributes"
            case autoAssignElasticIps = "AutoAssignElasticIps"
            case autoAssignPublicIps = "AutoAssignPublicIps"
            case cloudWatchLogsConfiguration = "CloudWatchLogsConfiguration"
            case createdAt = "CreatedAt"
            case customInstanceProfileArn = "CustomInstanceProfileArn"
            case customJson = "CustomJson"
            case customRecipes = "CustomRecipes"
            case customSecurityGroupIds = "CustomSecurityGroupIds"
            case defaultRecipes = "DefaultRecipes"
            case defaultSecurityGroupNames = "DefaultSecurityGroupNames"
            case enableAutoHealing = "EnableAutoHealing"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case layerId = "LayerId"
            case lifecycleEventConfiguration = "LifecycleEventConfiguration"
            case name = "Name"
            case packages = "Packages"
            case shortname = "Shortname"
            case stackId = "StackId"
            case type = "Type"
            case useEbsOptimizedInstances = "UseEbsOptimizedInstances"
            case volumeConfigurations = "VolumeConfigurations"
        }
    }

    public struct LifecycleEventConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// A ShutdownEventConfiguration object that specifies the Shutdown event configuration.
        public let shutdown: ShutdownEventConfiguration?

        @inlinable
        public init(shutdown: ShutdownEventConfiguration? = nil) {
            self.shutdown = shutdown
        }

        private enum CodingKeys: String, CodingKey {
            case shutdown = "Shutdown"
        }
    }

    public struct ListTagsRequest: AWSEncodableShape {
        /// Do not use. A validation exception occurs if you add a MaxResults parameter to a ListTagsRequest  call.
        public let maxResults: Int?
        /// Do not use. A validation exception occurs if you add a NextToken parameter to a ListTagsRequest  call.
        public let nextToken: String?
        /// The stack or layer's Amazon Resource Number (ARN).
        public let resourceArn: String

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, resourceArn: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resourceArn = resourceArn
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case resourceArn = "ResourceArn"
        }
    }

    public struct ListTagsResult: AWSDecodableShape {
        /// If a paginated request does not return all of the remaining results, this parameter is set to a token that you can assign to the request object's NextToken parameter to get the next set of results. If the previous paginated request returned all of the remaining results, this parameter is set to null.
        public let nextToken: String?
        /// A set of key-value pairs that contain tag keys and tag values that are attached to a stack or layer.
        public let tags: [String: String]?

        @inlinable
        public init(nextToken: String? = nil, tags: [String: String]? = nil) {
            self.nextToken = nextToken
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tags = "Tags"
        }
    }

    public struct LoadBasedAutoScalingConfiguration: AWSDecodableShape {
        /// An AutoScalingThresholds object that describes the downscaling configuration, which defines how and when OpsWorks Stacks reduces the number of instances.
        public let downScaling: AutoScalingThresholds?
        /// Whether load-based auto scaling is enabled for the layer.
        public let enable: Bool?
        /// The layer ID.
        public let layerId: String?
        /// An AutoScalingThresholds object that describes the upscaling configuration, which defines how and when OpsWorks Stacks increases the number of instances.
        public let upScaling: AutoScalingThresholds?

        @inlinable
        public init(downScaling: AutoScalingThresholds? = nil, enable: Bool? = nil, layerId: String? = nil, upScaling: AutoScalingThresholds? = nil) {
            self.downScaling = downScaling
            self.enable = enable
            self.layerId = layerId
            self.upScaling = upScaling
        }

        private enum CodingKeys: String, CodingKey {
            case downScaling = "DownScaling"
            case enable = "Enable"
            case layerId = "LayerId"
            case upScaling = "UpScaling"
        }
    }

    public struct OperatingSystem: AWSDecodableShape {
        /// Supported configuration manager name and versions for an OpsWorks Stacks operating system.
        public let configurationManagers: [OperatingSystemConfigurationManager]?
        /// The ID of a supported operating system, such as Amazon Linux 2.
        public let id: String?
        /// The name of the operating system, such as Amazon Linux 2.
        public let name: String?
        /// A short name for the operating system manufacturer.
        public let reportedName: String?
        /// The version of the operating system, including the release and edition, if applicable.
        public let reportedVersion: String?
        /// Indicates that an operating system is not supported for new instances.
        public let supported: Bool?
        /// The type of a supported operating system, either Linux or Windows.
        public let type: String?

        @inlinable
        public init(configurationManagers: [OperatingSystemConfigurationManager]? = nil, id: String? = nil, name: String? = nil, reportedName: String? = nil, reportedVersion: String? = nil, supported: Bool? = nil, type: String? = nil) {
            self.configurationManagers = configurationManagers
            self.id = id
            self.name = name
            self.reportedName = reportedName
            self.reportedVersion = reportedVersion
            self.supported = supported
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case configurationManagers = "ConfigurationManagers"
            case id = "Id"
            case name = "Name"
            case reportedName = "ReportedName"
            case reportedVersion = "ReportedVersion"
            case supported = "Supported"
            case type = "Type"
        }
    }

    public struct OperatingSystemConfigurationManager: AWSDecodableShape {
        /// The name of the configuration manager, which is Chef.
        public let name: String?
        /// The versions of the configuration manager that are supported by an operating system.
        public let version: String?

        @inlinable
        public init(name: String? = nil, version: String? = nil) {
            self.name = name
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case version = "Version"
        }
    }

    public struct Permission: AWSDecodableShape {
        /// Whether the user can use SSH.
        public let allowSsh: Bool?
        /// Whether the user can use sudo.
        public let allowSudo: Bool?
        /// The Amazon Resource Name (ARN) for an Identity and Access Management (IAM) role. For more information about IAM ARNs, see Using Identifiers.
        public let iamUserArn: String?
        /// The user's permission level, which must be the following:    deny     show     deploy     manage     iam_only    For more information on the permissions associated with these levels, see Managing User Permissions
        public let level: String?
        /// A stack ID.
        public let stackId: String?

        @inlinable
        public init(allowSsh: Bool? = nil, allowSudo: Bool? = nil, iamUserArn: String? = nil, level: String? = nil, stackId: String? = nil) {
            self.allowSsh = allowSsh
            self.allowSudo = allowSudo
            self.iamUserArn = iamUserArn
            self.level = level
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case allowSsh = "AllowSsh"
            case allowSudo = "AllowSudo"
            case iamUserArn = "IamUserArn"
            case level = "Level"
            case stackId = "StackId"
        }
    }

    public struct RaidArray: AWSDecodableShape {
        /// The array's Availability Zone. For more information, see Regions and Endpoints.
        public let availabilityZone: String?
        /// When the RAID array was created.
        public let createdAt: String?
        /// The array's Linux device. For example /dev/mdadm0.
        public let device: String?
        /// The instance ID.
        public let instanceId: String?
        /// For PIOPS volumes, the IOPS per disk.
        public let iops: Int?
        /// The array's mount point.
        public let mountPoint: String?
        /// The array name.
        public let name: String?
        /// The number of disks in the array.
        public let numberOfDisks: Int?
        /// The array ID.
        public let raidArrayId: String?
        /// The RAID level.
        public let raidLevel: Int?
        /// The array's size.
        public let size: Int?
        /// The stack ID.
        public let stackId: String?
        /// The volume type, standard or PIOPS.
        public let volumeType: String?

        @inlinable
        public init(availabilityZone: String? = nil, createdAt: String? = nil, device: String? = nil, instanceId: String? = nil, iops: Int? = nil, mountPoint: String? = nil, name: String? = nil, numberOfDisks: Int? = nil, raidArrayId: String? = nil, raidLevel: Int? = nil, size: Int? = nil, stackId: String? = nil, volumeType: String? = nil) {
            self.availabilityZone = availabilityZone
            self.createdAt = createdAt
            self.device = device
            self.instanceId = instanceId
            self.iops = iops
            self.mountPoint = mountPoint
            self.name = name
            self.numberOfDisks = numberOfDisks
            self.raidArrayId = raidArrayId
            self.raidLevel = raidLevel
            self.size = size
            self.stackId = stackId
            self.volumeType = volumeType
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case createdAt = "CreatedAt"
            case device = "Device"
            case instanceId = "InstanceId"
            case iops = "Iops"
            case mountPoint = "MountPoint"
            case name = "Name"
            case numberOfDisks = "NumberOfDisks"
            case raidArrayId = "RaidArrayId"
            case raidLevel = "RaidLevel"
            case size = "Size"
            case stackId = "StackId"
            case volumeType = "VolumeType"
        }
    }

    public struct RdsDbInstance: AWSDecodableShape {
        /// The instance's address.
        public let address: String?
        /// The database instance identifier.
        public let dbInstanceIdentifier: String?
        /// OpsWorks Stacks returns *****FILTERED***** instead of the actual value.
        public let dbPassword: String?
        /// The master user name.
        public let dbUser: String?
        /// The instance's database engine.
        public let engine: String?
        /// Set to true if OpsWorks Stacks is unable to discover the Amazon RDS instance.  OpsWorks Stacks attempts to discover the instance only once. If this value is set to true, you must deregister the instance, and then register it again.
        public let missingOnRds: Bool?
        /// The instance's ARN.
        public let rdsDbInstanceArn: String?
        /// The instance's Amazon Web Services Region.
        public let region: String?
        /// The ID of the stack with which the instance is registered.
        public let stackId: String?

        @inlinable
        public init(address: String? = nil, dbInstanceIdentifier: String? = nil, dbPassword: String? = nil, dbUser: String? = nil, engine: String? = nil, missingOnRds: Bool? = nil, rdsDbInstanceArn: String? = nil, region: String? = nil, stackId: String? = nil) {
            self.address = address
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.dbPassword = dbPassword
            self.dbUser = dbUser
            self.engine = engine
            self.missingOnRds = missingOnRds
            self.rdsDbInstanceArn = rdsDbInstanceArn
            self.region = region
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case address = "Address"
            case dbInstanceIdentifier = "DbInstanceIdentifier"
            case dbPassword = "DbPassword"
            case dbUser = "DbUser"
            case engine = "Engine"
            case missingOnRds = "MissingOnRds"
            case rdsDbInstanceArn = "RdsDbInstanceArn"
            case region = "Region"
            case stackId = "StackId"
        }
    }

    public struct RebootInstanceRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(instanceId: String) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct Recipes: AWSEncodableShape & AWSDecodableShape {
        /// An array of custom recipe names to be run following a configure event.
        public let configure: [String]?
        /// An array of custom recipe names to be run following a deploy event.
        public let deploy: [String]?
        /// An array of custom recipe names to be run following a setup event.
        public let setup: [String]?
        /// An array of custom recipe names to be run following a shutdown event.
        public let shutdown: [String]?
        /// An array of custom recipe names to be run following a undeploy event.
        public let undeploy: [String]?

        @inlinable
        public init(configure: [String]? = nil, deploy: [String]? = nil, setup: [String]? = nil, shutdown: [String]? = nil, undeploy: [String]? = nil) {
            self.configure = configure
            self.deploy = deploy
            self.setup = setup
            self.shutdown = shutdown
            self.undeploy = undeploy
        }

        private enum CodingKeys: String, CodingKey {
            case configure = "Configure"
            case deploy = "Deploy"
            case setup = "Setup"
            case shutdown = "Shutdown"
            case undeploy = "Undeploy"
        }
    }

    public struct RegisterEcsClusterRequest: AWSEncodableShape {
        /// The cluster's ARN.
        public let ecsClusterArn: String
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(ecsClusterArn: String, stackId: String) {
            self.ecsClusterArn = ecsClusterArn
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusterArn = "EcsClusterArn"
            case stackId = "StackId"
        }
    }

    public struct RegisterEcsClusterResult: AWSDecodableShape {
        /// The cluster's ARN.
        public let ecsClusterArn: String?

        @inlinable
        public init(ecsClusterArn: String? = nil) {
            self.ecsClusterArn = ecsClusterArn
        }

        private enum CodingKeys: String, CodingKey {
            case ecsClusterArn = "EcsClusterArn"
        }
    }

    public struct RegisterElasticIpRequest: AWSEncodableShape {
        /// The Elastic IP address.
        public let elasticIp: String
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(elasticIp: String, stackId: String) {
            self.elasticIp = elasticIp
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
            case stackId = "StackId"
        }
    }

    public struct RegisterElasticIpResult: AWSDecodableShape {
        /// The Elastic IP address.
        public let elasticIp: String?

        @inlinable
        public init(elasticIp: String? = nil) {
            self.elasticIp = elasticIp
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
        }
    }

    public struct RegisterInstanceRequest: AWSEncodableShape {
        /// The instance's host name. The following are character limits for instance host names.   Linux-based instances: 63 characters   Windows-based instances: 15 characters
        public let hostname: String?
        /// An InstanceIdentity object that contains the instance's identity.
        public let instanceIdentity: InstanceIdentity?
        /// The instance's private IP address.
        public let privateIp: String?
        /// The instance's public IP address.
        public let publicIp: String?
        /// The instances public RSA key. This key is used to encrypt communication between the instance and the service.
        public let rsaPublicKey: String?
        /// The instances public RSA key fingerprint.
        public let rsaPublicKeyFingerprint: String?
        /// The ID of the stack that the instance is to be registered with.
        public let stackId: String

        @inlinable
        public init(hostname: String? = nil, instanceIdentity: InstanceIdentity? = nil, privateIp: String? = nil, publicIp: String? = nil, rsaPublicKey: String? = nil, rsaPublicKeyFingerprint: String? = nil, stackId: String) {
            self.hostname = hostname
            self.instanceIdentity = instanceIdentity
            self.privateIp = privateIp
            self.publicIp = publicIp
            self.rsaPublicKey = rsaPublicKey
            self.rsaPublicKeyFingerprint = rsaPublicKeyFingerprint
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case hostname = "Hostname"
            case instanceIdentity = "InstanceIdentity"
            case privateIp = "PrivateIp"
            case publicIp = "PublicIp"
            case rsaPublicKey = "RsaPublicKey"
            case rsaPublicKeyFingerprint = "RsaPublicKeyFingerprint"
            case stackId = "StackId"
        }
    }

    public struct RegisterInstanceResult: AWSDecodableShape {
        /// The registered instance's OpsWorks Stacks ID.
        public let instanceId: String?

        @inlinable
        public init(instanceId: String? = nil) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct RegisterRdsDbInstanceRequest: AWSEncodableShape {
        /// The database password.
        public let dbPassword: String
        /// The database's master user name.
        public let dbUser: String
        /// The Amazon RDS instance's ARN.
        public let rdsDbInstanceArn: String
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(dbPassword: String, dbUser: String, rdsDbInstanceArn: String, stackId: String) {
            self.dbPassword = dbPassword
            self.dbUser = dbUser
            self.rdsDbInstanceArn = rdsDbInstanceArn
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case dbPassword = "DbPassword"
            case dbUser = "DbUser"
            case rdsDbInstanceArn = "RdsDbInstanceArn"
            case stackId = "StackId"
        }
    }

    public struct RegisterVolumeRequest: AWSEncodableShape {
        /// The Amazon EBS volume ID.
        public let ec2VolumeId: String?
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(ec2VolumeId: String? = nil, stackId: String) {
            self.ec2VolumeId = ec2VolumeId
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case ec2VolumeId = "Ec2VolumeId"
            case stackId = "StackId"
        }
    }

    public struct RegisterVolumeResult: AWSDecodableShape {
        /// The volume ID.
        public let volumeId: String?

        @inlinable
        public init(volumeId: String? = nil) {
            self.volumeId = volumeId
        }

        private enum CodingKeys: String, CodingKey {
            case volumeId = "VolumeId"
        }
    }

    public struct ReportedOs: AWSDecodableShape {
        /// The operating system family.
        public let family: String?
        /// The operating system name.
        public let name: String?
        /// The operating system version.
        public let version: String?

        @inlinable
        public init(family: String? = nil, name: String? = nil, version: String? = nil) {
            self.family = family
            self.name = name
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case family = "Family"
            case name = "Name"
            case version = "Version"
        }
    }

    public struct SelfUserProfile: AWSDecodableShape {
        /// The user's IAM ARN.
        public let iamUserArn: String?
        /// The user's name.
        public let name: String?
        /// The user's SSH public key.
        public let sshPublicKey: String?
        /// The user's SSH user name.
        public let sshUsername: String?

        @inlinable
        public init(iamUserArn: String? = nil, name: String? = nil, sshPublicKey: String? = nil, sshUsername: String? = nil) {
            self.iamUserArn = iamUserArn
            self.name = name
            self.sshPublicKey = sshPublicKey
            self.sshUsername = sshUsername
        }

        private enum CodingKeys: String, CodingKey {
            case iamUserArn = "IamUserArn"
            case name = "Name"
            case sshPublicKey = "SshPublicKey"
            case sshUsername = "SshUsername"
        }
    }

    public struct ServiceError: AWSDecodableShape {
        /// When the error occurred.
        public let createdAt: String?
        /// The instance ID.
        public let instanceId: String?
        /// A message that describes the error.
        public let message: String?
        /// The error ID.
        public let serviceErrorId: String?
        /// The stack ID.
        public let stackId: String?
        /// The error type.
        public let type: String?

        @inlinable
        public init(createdAt: String? = nil, instanceId: String? = nil, message: String? = nil, serviceErrorId: String? = nil, stackId: String? = nil, type: String? = nil) {
            self.createdAt = createdAt
            self.instanceId = instanceId
            self.message = message
            self.serviceErrorId = serviceErrorId
            self.stackId = stackId
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "CreatedAt"
            case instanceId = "InstanceId"
            case message = "Message"
            case serviceErrorId = "ServiceErrorId"
            case stackId = "StackId"
            case type = "Type"
        }
    }

    public struct SetLoadBasedAutoScalingRequest: AWSEncodableShape {
        /// An AutoScalingThresholds object with the downscaling threshold configuration. If the load falls below these thresholds for a specified amount of time, OpsWorks Stacks stops a specified number of instances.
        public let downScaling: AutoScalingThresholds?
        /// Enables load-based auto scaling for the layer.
        public let enable: Bool?
        /// The layer ID.
        public let layerId: String
        /// An AutoScalingThresholds object with the upscaling threshold configuration. If the load exceeds these thresholds for a specified amount of time, OpsWorks Stacks starts a specified number of instances.
        public let upScaling: AutoScalingThresholds?

        @inlinable
        public init(downScaling: AutoScalingThresholds? = nil, enable: Bool? = nil, layerId: String, upScaling: AutoScalingThresholds? = nil) {
            self.downScaling = downScaling
            self.enable = enable
            self.layerId = layerId
            self.upScaling = upScaling
        }

        public func validate(name: String) throws {
            try self.downScaling?.validate(name: "\(name).downScaling")
            try self.upScaling?.validate(name: "\(name).upScaling")
        }

        private enum CodingKeys: String, CodingKey {
            case downScaling = "DownScaling"
            case enable = "Enable"
            case layerId = "LayerId"
            case upScaling = "UpScaling"
        }
    }

    public struct SetPermissionRequest: AWSEncodableShape {
        /// The user is allowed to use SSH to communicate with the instance.
        public let allowSsh: Bool?
        /// The user is allowed to use sudo to elevate privileges.
        public let allowSudo: Bool?
        /// The user's IAM ARN. This can also be a federated user's ARN.
        public let iamUserArn: String
        /// The user's permission level, which must be set to one of the following strings. You cannot set your own permissions level.    deny     show     deploy     manage     iam_only    For more information about the permissions associated with these levels, see Managing User Permissions.
        public let level: String?
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(allowSsh: Bool? = nil, allowSudo: Bool? = nil, iamUserArn: String, level: String? = nil, stackId: String) {
            self.allowSsh = allowSsh
            self.allowSudo = allowSudo
            self.iamUserArn = iamUserArn
            self.level = level
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case allowSsh = "AllowSsh"
            case allowSudo = "AllowSudo"
            case iamUserArn = "IamUserArn"
            case level = "Level"
            case stackId = "StackId"
        }
    }

    public struct SetTimeBasedAutoScalingRequest: AWSEncodableShape {
        /// An AutoScalingSchedule with the instance schedule.
        public let autoScalingSchedule: WeeklyAutoScalingSchedule?
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(autoScalingSchedule: WeeklyAutoScalingSchedule? = nil, instanceId: String) {
            self.autoScalingSchedule = autoScalingSchedule
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingSchedule = "AutoScalingSchedule"
            case instanceId = "InstanceId"
        }
    }

    public struct ShutdownEventConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// Whether to enable Elastic Load Balancing connection draining. For more information, see Connection Draining
        public let delayUntilElbConnectionsDrained: Bool?
        /// The time, in seconds, that OpsWorks Stacks waits after triggering a Shutdown event before  shutting down an instance.
        public let executionTimeout: Int?

        @inlinable
        public init(delayUntilElbConnectionsDrained: Bool? = nil, executionTimeout: Int? = nil) {
            self.delayUntilElbConnectionsDrained = delayUntilElbConnectionsDrained
            self.executionTimeout = executionTimeout
        }

        private enum CodingKeys: String, CodingKey {
            case delayUntilElbConnectionsDrained = "DelayUntilElbConnectionsDrained"
            case executionTimeout = "ExecutionTimeout"
        }
    }

    public struct Source: AWSEncodableShape & AWSDecodableShape {
        /// When included in a request, the parameter depends on the repository type.   For Amazon S3 bundles, set Password to the appropriate IAM secret access key.   For HTTP bundles and Subversion repositories, set Password to the password.   For more information on how to safely handle IAM credentials, see https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html. In responses, OpsWorks Stacks returns *****FILTERED***** instead of the actual value.
        public let password: String?
        /// The application's version. OpsWorks Stacks enables you to easily deploy new versions of an application.  One of the simplest approaches is to have branches or revisions in your repository that represent different  versions that can potentially be deployed.
        public let revision: String?
        /// In requests, the repository's SSH key. In responses, OpsWorks Stacks returns *****FILTERED***** instead of the actual value.
        public let sshKey: String?
        /// The repository type.
        public let type: SourceType?
        /// The source URL. The following is an example of an Amazon S3 source  URL:  https://s3.amazonaws.com/opsworks-demo-bucket/opsworks_cookbook_demo.tar.gz.
        public let url: String?
        /// This parameter depends on the repository type.   For Amazon S3 bundles, set Username to the appropriate IAM access key ID.   For HTTP bundles, Git repositories, and Subversion repositories, set Username to the user name.
        public let username: String?

        @inlinable
        public init(password: String? = nil, revision: String? = nil, sshKey: String? = nil, type: SourceType? = nil, url: String? = nil, username: String? = nil) {
            self.password = password
            self.revision = revision
            self.sshKey = sshKey
            self.type = type
            self.url = url
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case password = "Password"
            case revision = "Revision"
            case sshKey = "SshKey"
            case type = "Type"
            case url = "Url"
            case username = "Username"
        }
    }

    public struct SslConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// The contents of the certificate's domain.crt file.
        public let certificate: String
        /// Optional. Can be used to specify an intermediate certificate authority key or client authentication.
        public let chain: String?
        /// The private key; the contents of the certificate's domain.kex file.
        public let privateKey: String

        @inlinable
        public init(certificate: String, chain: String? = nil, privateKey: String) {
            self.certificate = certificate
            self.chain = chain
            self.privateKey = privateKey
        }

        private enum CodingKeys: String, CodingKey {
            case certificate = "Certificate"
            case chain = "Chain"
            case privateKey = "PrivateKey"
        }
    }

    public struct Stack: AWSDecodableShape {
        /// The agent version. This parameter is set to LATEST for auto-update. or a version number for a fixed agent version.
        public let agentVersion: String?
        /// The stack's ARN.
        public let arn: String?
        /// The stack's attributes.
        public let attributes: [StackAttributesKeys: String]?
        /// A ChefConfiguration object that specifies whether to enable Berkshelf and the Berkshelf version. For more information, see Create a New Stack.
        public let chefConfiguration: ChefConfiguration?
        /// The configuration manager.
        public let configurationManager: StackConfigurationManager?
        /// The date when the stack was created.
        public let createdAt: String?
        /// Contains the information required to retrieve an app or cookbook from a repository. For more information,  see Adding Apps or  Cookbooks and Recipes.
        public let customCookbooksSource: Source?
        /// A JSON object that contains user-defined attributes to be added to the stack configuration and deployment attributes.  You can use custom JSON to override the corresponding default stack configuration attribute values or to pass data to recipes.  The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information on custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes.
        public let customJson: String?
        /// The stack's default Availability Zone. For more information, see Regions and Endpoints.
        public let defaultAvailabilityZone: String?
        /// The ARN of an IAM profile that is the default profile for all of the stack's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let defaultInstanceProfileArn: String?
        /// The stack's default operating system.
        public let defaultOs: String?
        /// The default root device type. This value is used by default for all instances in the stack, but you can override it when you create an instance. For more information, see Storage for the Root Device.
        public let defaultRootDeviceType: RootDeviceType?
        /// A default Amazon EC2 key pair for the stack's instances. You can override this value when you create or  update an instance.
        public let defaultSshKeyName: String?
        /// The default subnet ID; applicable only if the stack is running in a VPC.
        public let defaultSubnetId: String?
        /// The stack host name theme, with spaces replaced by underscores.
        public let hostnameTheme: String?
        /// The stack name. Stack names can be a maximum of 64 characters.
        public let name: String?
        /// The stack Amazon Web Services Region, such as ap-northeast-2. For more information about  Amazon Web Services Regions, see Regions and Endpoints.
        public let region: String?
        /// The stack Identity and Access Management (IAM) role.
        public let serviceRoleArn: String?
        /// The stack ID.
        public let stackId: String?
        /// Whether the stack uses custom cookbooks.
        public let useCustomCookbooks: Bool?
        /// Whether the stack automatically associates the OpsWorks Stacks built-in security groups with the stack's layers.
        public let useOpsworksSecurityGroups: Bool?
        /// The VPC ID; applicable only if the stack is running in a VPC.
        public let vpcId: String?

        @inlinable
        public init(agentVersion: String? = nil, arn: String? = nil, attributes: [StackAttributesKeys: String]? = nil, chefConfiguration: ChefConfiguration? = nil, configurationManager: StackConfigurationManager? = nil, createdAt: String? = nil, customCookbooksSource: Source? = nil, customJson: String? = nil, defaultAvailabilityZone: String? = nil, defaultInstanceProfileArn: String? = nil, defaultOs: String? = nil, defaultRootDeviceType: RootDeviceType? = nil, defaultSshKeyName: String? = nil, defaultSubnetId: String? = nil, hostnameTheme: String? = nil, name: String? = nil, region: String? = nil, serviceRoleArn: String? = nil, stackId: String? = nil, useCustomCookbooks: Bool? = nil, useOpsworksSecurityGroups: Bool? = nil, vpcId: String? = nil) {
            self.agentVersion = agentVersion
            self.arn = arn
            self.attributes = attributes
            self.chefConfiguration = chefConfiguration
            self.configurationManager = configurationManager
            self.createdAt = createdAt
            self.customCookbooksSource = customCookbooksSource
            self.customJson = customJson
            self.defaultAvailabilityZone = defaultAvailabilityZone
            self.defaultInstanceProfileArn = defaultInstanceProfileArn
            self.defaultOs = defaultOs
            self.defaultRootDeviceType = defaultRootDeviceType
            self.defaultSshKeyName = defaultSshKeyName
            self.defaultSubnetId = defaultSubnetId
            self.hostnameTheme = hostnameTheme
            self.name = name
            self.region = region
            self.serviceRoleArn = serviceRoleArn
            self.stackId = stackId
            self.useCustomCookbooks = useCustomCookbooks
            self.useOpsworksSecurityGroups = useOpsworksSecurityGroups
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case arn = "Arn"
            case attributes = "Attributes"
            case chefConfiguration = "ChefConfiguration"
            case configurationManager = "ConfigurationManager"
            case createdAt = "CreatedAt"
            case customCookbooksSource = "CustomCookbooksSource"
            case customJson = "CustomJson"
            case defaultAvailabilityZone = "DefaultAvailabilityZone"
            case defaultInstanceProfileArn = "DefaultInstanceProfileArn"
            case defaultOs = "DefaultOs"
            case defaultRootDeviceType = "DefaultRootDeviceType"
            case defaultSshKeyName = "DefaultSshKeyName"
            case defaultSubnetId = "DefaultSubnetId"
            case hostnameTheme = "HostnameTheme"
            case name = "Name"
            case region = "Region"
            case serviceRoleArn = "ServiceRoleArn"
            case stackId = "StackId"
            case useCustomCookbooks = "UseCustomCookbooks"
            case useOpsworksSecurityGroups = "UseOpsworksSecurityGroups"
            case vpcId = "VpcId"
        }
    }

    public struct StackConfigurationManager: AWSEncodableShape & AWSDecodableShape {
        /// The name. This parameter must be set to Chef.
        public let name: String?
        /// The Chef version. This parameter must be set to 12, 11.10, or 11.4 for Linux stacks, and to 12.2 for Windows stacks.  The default value for Linux stacks is 12.
        public let version: String?

        @inlinable
        public init(name: String? = nil, version: String? = nil) {
            self.name = name
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case version = "Version"
        }
    }

    public struct StackSummary: AWSDecodableShape {
        /// The number of apps.
        public let appsCount: Int?
        /// The stack's ARN.
        public let arn: String?
        /// An InstancesCount object with the number of instances in each status.
        public let instancesCount: InstancesCount?
        /// The number of layers.
        public let layersCount: Int?
        /// The stack name.
        public let name: String?
        /// The stack ID.
        public let stackId: String?

        @inlinable
        public init(appsCount: Int? = nil, arn: String? = nil, instancesCount: InstancesCount? = nil, layersCount: Int? = nil, name: String? = nil, stackId: String? = nil) {
            self.appsCount = appsCount
            self.arn = arn
            self.instancesCount = instancesCount
            self.layersCount = layersCount
            self.name = name
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case appsCount = "AppsCount"
            case arn = "Arn"
            case instancesCount = "InstancesCount"
            case layersCount = "LayersCount"
            case name = "Name"
            case stackId = "StackId"
        }
    }

    public struct StartInstanceRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(instanceId: String) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct StartStackRequest: AWSEncodableShape {
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(stackId: String) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct StopInstanceRequest: AWSEncodableShape {
        /// Specifies whether to force an instance to stop. If the instance's root device type is ebs, or EBS-backed,  adding the Force parameter to the StopInstances API call disassociates the OpsWorks Stacks  instance from EC2, and forces deletion of only the OpsWorks Stacks instance.  You must also delete the formerly-associated instance in EC2 after troubleshooting and replacing the OpsWorks Stacks  instance with a new one.
        public let force: Bool?
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(force: Bool? = nil, instanceId: String) {
            self.force = force
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case force = "Force"
            case instanceId = "InstanceId"
        }
    }

    public struct StopStackRequest: AWSEncodableShape {
        /// The stack ID.
        public let stackId: String

        @inlinable
        public init(stackId: String) {
            self.stackId = stackId
        }

        private enum CodingKeys: String, CodingKey {
            case stackId = "StackId"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        /// The stack or layer's Amazon Resource Number (ARN).
        public let resourceArn: String
        /// A map that contains tag keys and tag values that are attached to a stack or layer.   The key cannot be empty.   The key can be a maximum of 127 characters, and can contain only Unicode letters, numbers, or separators,  or the following special characters: + - = . _ : /    The value can be a maximum 255 characters, and contain only Unicode letters, numbers, or separators,  or the following special characters: + - = . _ : /    Leading and trailing white spaces are trimmed from both the key and value.   A maximum of 40 tags is allowed for any resource.
        public let tags: [String: String]

        @inlinable
        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tags = "Tags"
        }
    }

    public struct TemporaryCredential: AWSDecodableShape {
        /// The instance's OpsWorks Stacks ID.
        public let instanceId: String?
        /// The password.
        public let password: String?
        /// The user name.
        public let username: String?
        /// The length of time (in minutes) that the grant is valid. When the grant expires, at the end of this period,  the user will no longer be able to use the credentials to log in. If they are logged in at the time, they are  automatically logged out.
        public let validForInMinutes: Int?

        @inlinable
        public init(instanceId: String? = nil, password: String? = nil, username: String? = nil, validForInMinutes: Int? = nil) {
            self.instanceId = instanceId
            self.password = password
            self.username = username
            self.validForInMinutes = validForInMinutes
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case password = "Password"
            case username = "Username"
            case validForInMinutes = "ValidForInMinutes"
        }
    }

    public struct TimeBasedAutoScalingConfiguration: AWSDecodableShape {
        /// A WeeklyAutoScalingSchedule object with the instance schedule.
        public let autoScalingSchedule: WeeklyAutoScalingSchedule?
        /// The instance ID.
        public let instanceId: String?

        @inlinable
        public init(autoScalingSchedule: WeeklyAutoScalingSchedule? = nil, instanceId: String? = nil) {
            self.autoScalingSchedule = autoScalingSchedule
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingSchedule = "AutoScalingSchedule"
            case instanceId = "InstanceId"
        }
    }

    public struct UnassignInstanceRequest: AWSEncodableShape {
        /// The instance ID.
        public let instanceId: String

        @inlinable
        public init(instanceId: String) {
            self.instanceId = instanceId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
        }
    }

    public struct UnassignVolumeRequest: AWSEncodableShape {
        /// The volume ID.
        public let volumeId: String

        @inlinable
        public init(volumeId: String) {
            self.volumeId = volumeId
        }

        private enum CodingKeys: String, CodingKey {
            case volumeId = "VolumeId"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        /// The stack or layer's Amazon Resource Number (ARN).
        public let resourceArn: String
        /// A list of the keys of tags to be removed from a stack or layer.
        public let tagKeys: [String]

        @inlinable
        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tagKeys = "TagKeys"
        }
    }

    public struct UpdateAppRequest: AWSEncodableShape {
        /// The app ID.
        public let appId: String
        /// A Source object that specifies the app repository.
        public let appSource: Source?
        /// One or more user-defined key/value pairs to be added to the stack attributes.
        public let attributes: [AppAttributesKeys: String]?
        /// The app's data sources.
        public let dataSources: [DataSource]?
        /// A description of the app.
        public let description: String?
        /// The app's virtual host settings, with multiple domains separated by commas. For example: 'www.example.com, example.com'
        public let domains: [String]?
        /// Whether SSL is enabled for the app.
        public let enableSsl: Bool?
        /// An array of EnvironmentVariable objects that specify environment variables to be associated with the app. After you deploy the app, these variables are defined on the associated app server instances.For more information, see  Environment Variables. There is no specific limit on the number of environment variables. However, the size of the associated data structure -  which includes the variables' names, values, and protected flag values - cannot exceed 20 KB. This limit should accommodate most  if not all use cases. Exceeding it will cause an exception with the message, "Environment: is too large (maximum is 20 KB)."  If you have specified one or more environment variables, you cannot modify the stack's Chef version.
        public let environment: [EnvironmentVariable]?
        /// The app name.
        public let name: String?
        /// An SslConfiguration object with the SSL configuration.
        public let sslConfiguration: SslConfiguration?
        /// The app type.
        public let type: AppType?

        @inlinable
        public init(appId: String, appSource: Source? = nil, attributes: [AppAttributesKeys: String]? = nil, dataSources: [DataSource]? = nil, description: String? = nil, domains: [String]? = nil, enableSsl: Bool? = nil, environment: [EnvironmentVariable]? = nil, name: String? = nil, sslConfiguration: SslConfiguration? = nil, type: AppType? = nil) {
            self.appId = appId
            self.appSource = appSource
            self.attributes = attributes
            self.dataSources = dataSources
            self.description = description
            self.domains = domains
            self.enableSsl = enableSsl
            self.environment = environment
            self.name = name
            self.sslConfiguration = sslConfiguration
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case appId = "AppId"
            case appSource = "AppSource"
            case attributes = "Attributes"
            case dataSources = "DataSources"
            case description = "Description"
            case domains = "Domains"
            case enableSsl = "EnableSsl"
            case environment = "Environment"
            case name = "Name"
            case sslConfiguration = "SslConfiguration"
            case type = "Type"
        }
    }

    public struct UpdateElasticIpRequest: AWSEncodableShape {
        /// The IP address for which you want to update the name.
        public let elasticIp: String
        /// The new name, which can be a maximum of 32 characters.
        public let name: String?

        @inlinable
        public init(elasticIp: String, name: String? = nil) {
            self.elasticIp = elasticIp
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case elasticIp = "ElasticIp"
            case name = "Name"
        }
    }

    public struct UpdateInstanceRequest: AWSEncodableShape {
        /// The default OpsWorks Stacks agent version. You have the following options:    INHERIT - Use the stack's default agent version setting.    version_number - Use the specified agent version. This value overrides the stack's default setting. To update the agent version, you must edit the instance configuration and specify a new version. OpsWorks Stacks installs that version on the instance.   The default setting is INHERIT. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call DescribeAgentVersions. AgentVersion cannot be set to Chef 12.2.
        public let agentVersion: String?
        /// The ID of the AMI that was used to create the instance. The value of this parameter must be the same AMI ID that the  instance is already using.  You cannot apply a new AMI to an instance by running UpdateInstance. UpdateInstance does not work on instances that are using  custom AMIs.
        public let amiId: String?
        /// The instance architecture. Instance types do not necessarily support both architectures. For a list of the architectures that are supported by the different instance types, see Instance Families and Types.
        public let architecture: Architecture?
        /// For load-based or time-based instances, the type. Windows stacks can use only time-based instances.
        public let autoScalingType: AutoScalingType?
        /// This property cannot be updated.
        public let ebsOptimized: Bool?
        /// The instance host name. The following are character limits for instance host names.   Linux-based instances: 63 characters   Windows-based instances: 15 characters
        public let hostname: String?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. To control when updates are installed, set this value to false. You must then update your instances manually by using CreateDeployment to run the update_dependencies stack command or by manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We strongly recommend using the default value of true, to ensure that your instances have the latest security updates.
        public let installUpdatesOnBoot: Bool?
        /// The instance ID.
        public let instanceId: String
        /// The instance type, such as t2.micro. For a list of supported instance types, open the stack in the console, choose Instances, and choose + Instance. The Size list contains the currently supported types. For more information, see Instance Families and Types. The parameter values that you use to specify the various types are in the API Name column of the Available Instance Types table.
        public let instanceType: String?
        /// The instance's layer IDs.
        public let layerIds: [String]?
        /// The instance's operating system, which must be set to one of the following. You cannot update an instance that is using  a custom AMI.   A supported Linux operating system: An Amazon Linux version, such as Amazon Linux 2, Amazon Linux 2018.03, Amazon Linux 2017.09, Amazon Linux 2017.03, Amazon Linux 2016.09, Amazon Linux 2016.03, Amazon Linux 2015.09, or Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 18.04 LTS, Ubuntu 16.04 LTS, Ubuntu 14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7    A supported Windows operating system, such as Microsoft Windows Server 2012 R2 Base, Microsoft Windows Server 2012 R2 with SQL Server Express,  Microsoft Windows Server 2012 R2 with SQL Server Standard, or Microsoft Windows Server 2012 R2 with SQL Server Web.   Not all operating systems are supported with all versions of Chef. For more information about supported operating systems, see OpsWorks Stacks Operating Systems. The default option is the current Amazon Linux version. If you set this parameter to Custom, you must use the AmiId parameter to specify the custom AMI that you want to use. For more information about how to use custom AMIs with OpsWorks, see Using Custom AMIs.  You can specify a different Linux operating system for the updated stack, but you cannot change from Linux to Windows or Windows to Linux.
        public let os: String?
        /// The instance's Amazon EC2 key name.
        public let sshKeyName: String?

        @inlinable
        public init(agentVersion: String? = nil, amiId: String? = nil, architecture: Architecture? = nil, autoScalingType: AutoScalingType? = nil, ebsOptimized: Bool? = nil, hostname: String? = nil, installUpdatesOnBoot: Bool? = nil, instanceId: String, instanceType: String? = nil, layerIds: [String]? = nil, os: String? = nil, sshKeyName: String? = nil) {
            self.agentVersion = agentVersion
            self.amiId = amiId
            self.architecture = architecture
            self.autoScalingType = autoScalingType
            self.ebsOptimized = ebsOptimized
            self.hostname = hostname
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.instanceId = instanceId
            self.instanceType = instanceType
            self.layerIds = layerIds
            self.os = os
            self.sshKeyName = sshKeyName
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case amiId = "AmiId"
            case architecture = "Architecture"
            case autoScalingType = "AutoScalingType"
            case ebsOptimized = "EbsOptimized"
            case hostname = "Hostname"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case instanceId = "InstanceId"
            case instanceType = "InstanceType"
            case layerIds = "LayerIds"
            case os = "Os"
            case sshKeyName = "SshKeyName"
        }
    }

    public struct UpdateLayerRequest: AWSEncodableShape {
        /// One or more user-defined key/value pairs to be added to the stack attributes.
        public let attributes: [LayerAttributesKeys: String]?
        /// Whether to automatically assign an Elastic IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignElasticIps: Bool?
        /// For stacks that are running in a VPC, whether to automatically assign a public IP address to the layer's instances. For more information, see How to Edit a Layer.
        public let autoAssignPublicIps: Bool?
        /// Specifies CloudWatch Logs configuration options for the layer. For more information,  see CloudWatchLogsLogStream.
        public let cloudWatchLogsConfiguration: CloudWatchLogsConfiguration?
        /// The ARN of an IAM profile to be used for all of the layer's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let customInstanceProfileArn: String?
        /// A JSON-formatted string containing custom stack configuration and deployment attributes to be installed on the layer's instances. For more information, see  Using Custom JSON.
        public let customJson: String?
        /// A LayerCustomRecipes object that specifies the layer's custom recipes.
        public let customRecipes: Recipes?
        /// An array containing the layer's custom security group IDs.
        public let customSecurityGroupIds: [String]?
        /// Whether to disable auto healing for the layer.
        public let enableAutoHealing: Bool?
        /// Whether to install operating system and package updates when the instance boots. The default value is true. To control when updates are installed, set this value to false. You must then update your instances manually by using CreateDeployment to run the update_dependencies stack command or manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We strongly recommend using the default value of true, to ensure that your instances have the latest security updates.
        public let installUpdatesOnBoot: Bool?
        /// The layer ID.
        public let layerId: String
        public let lifecycleEventConfiguration: LifecycleEventConfiguration?
        /// The layer name, which is used by the console. Layer names can be a maximum of 32 characters.
        public let name: String?
        /// An array of Package objects that describe the layer's packages.
        public let packages: [String]?
        /// For custom layers only, use this parameter to specify the layer's short name, which is used internally by  OpsWorks Stacks and by Chef. The short name is also used as the name for the directory where your app files  are installed. It can have a maximum of 32 characters and must be in the following format: /\A[a-z0-9\-\_\.]+\Z/. Built-in layer short names are defined by OpsWorks Stacks. For more information, see the  Layer reference in the OpsWorks User Guide.
        public let shortname: String?
        /// Whether to use Amazon EBS-optimized instances.
        public let useEbsOptimizedInstances: Bool?
        /// A VolumeConfigurations object that describes the layer's Amazon EBS volumes.
        public let volumeConfigurations: [VolumeConfiguration]?

        @inlinable
        public init(attributes: [LayerAttributesKeys: String]? = nil, autoAssignElasticIps: Bool? = nil, autoAssignPublicIps: Bool? = nil, cloudWatchLogsConfiguration: CloudWatchLogsConfiguration? = nil, customInstanceProfileArn: String? = nil, customJson: String? = nil, customRecipes: Recipes? = nil, customSecurityGroupIds: [String]? = nil, enableAutoHealing: Bool? = nil, installUpdatesOnBoot: Bool? = nil, layerId: String, lifecycleEventConfiguration: LifecycleEventConfiguration? = nil, name: String? = nil, packages: [String]? = nil, shortname: String? = nil, useEbsOptimizedInstances: Bool? = nil, volumeConfigurations: [VolumeConfiguration]? = nil) {
            self.attributes = attributes
            self.autoAssignElasticIps = autoAssignElasticIps
            self.autoAssignPublicIps = autoAssignPublicIps
            self.cloudWatchLogsConfiguration = cloudWatchLogsConfiguration
            self.customInstanceProfileArn = customInstanceProfileArn
            self.customJson = customJson
            self.customRecipes = customRecipes
            self.customSecurityGroupIds = customSecurityGroupIds
            self.enableAutoHealing = enableAutoHealing
            self.installUpdatesOnBoot = installUpdatesOnBoot
            self.layerId = layerId
            self.lifecycleEventConfiguration = lifecycleEventConfiguration
            self.name = name
            self.packages = packages
            self.shortname = shortname
            self.useEbsOptimizedInstances = useEbsOptimizedInstances
            self.volumeConfigurations = volumeConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case autoAssignElasticIps = "AutoAssignElasticIps"
            case autoAssignPublicIps = "AutoAssignPublicIps"
            case cloudWatchLogsConfiguration = "CloudWatchLogsConfiguration"
            case customInstanceProfileArn = "CustomInstanceProfileArn"
            case customJson = "CustomJson"
            case customRecipes = "CustomRecipes"
            case customSecurityGroupIds = "CustomSecurityGroupIds"
            case enableAutoHealing = "EnableAutoHealing"
            case installUpdatesOnBoot = "InstallUpdatesOnBoot"
            case layerId = "LayerId"
            case lifecycleEventConfiguration = "LifecycleEventConfiguration"
            case name = "Name"
            case packages = "Packages"
            case shortname = "Shortname"
            case useEbsOptimizedInstances = "UseEbsOptimizedInstances"
            case volumeConfigurations = "VolumeConfigurations"
        }
    }

    public struct UpdateMyUserProfileRequest: AWSEncodableShape {
        /// The user's SSH public key.
        public let sshPublicKey: String?

        @inlinable
        public init(sshPublicKey: String? = nil) {
            self.sshPublicKey = sshPublicKey
        }

        private enum CodingKeys: String, CodingKey {
            case sshPublicKey = "SshPublicKey"
        }
    }

    public struct UpdateRdsDbInstanceRequest: AWSEncodableShape {
        /// The database password.
        public let dbPassword: String?
        /// The master user name.
        public let dbUser: String?
        /// The Amazon RDS instance's ARN.
        public let rdsDbInstanceArn: String

        @inlinable
        public init(dbPassword: String? = nil, dbUser: String? = nil, rdsDbInstanceArn: String) {
            self.dbPassword = dbPassword
            self.dbUser = dbUser
            self.rdsDbInstanceArn = rdsDbInstanceArn
        }

        private enum CodingKeys: String, CodingKey {
            case dbPassword = "DbPassword"
            case dbUser = "DbUser"
            case rdsDbInstanceArn = "RdsDbInstanceArn"
        }
    }

    public struct UpdateStackRequest: AWSEncodableShape {
        /// The default OpsWorks Stacks agent version. You have the following options:   Auto-update - Set this parameter to LATEST. OpsWorks Stacks automatically installs new agent versions on the stack's instances as soon as they are available.   Fixed version - Set this parameter to your preferred agent version. To update the agent version, you must  edit the stack configuration and specify a new version. OpsWorks Stacks installs that version  on the stack's instances.   The default setting is LATEST. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call DescribeAgentVersions.  AgentVersion cannot be set to Chef 12.2.  You can also specify an agent version when you create or update an instance, which overrides the stack's default  setting.
        public let agentVersion: String?
        /// One or more user-defined key-value pairs to be added to the stack attributes.
        public let attributes: [StackAttributesKeys: String]?
        /// A ChefConfiguration object that specifies whether to enable Berkshelf and the Berkshelf version on Chef 11.10 stacks. For more information, see Create a New Stack.
        public let chefConfiguration: ChefConfiguration?
        /// The configuration manager. When you update a stack, we recommend that you use the configuration manager to specify the  Chef version: 12, 11.10, or 11.4 for Linux stacks, or 12.2 for Windows stacks. The default value for Linux stacks is currently 12.
        public let configurationManager: StackConfigurationManager?
        /// Contains the information required to retrieve an app or cookbook from a repository. For more information,  see Adding Apps or  Cookbooks and Recipes.
        public let customCookbooksSource: Source?
        /// A string that contains user-defined, custom JSON. It can be used to override the corresponding default stack configuration  JSON values or to pass data to recipes. The string should be in the following format:  "{\"key1\": \"value1\", \"key2\": \"value2\",...}"  For more information about custom JSON, see Use Custom JSON to Modify the Stack Configuration Attributes.
        public let customJson: String?
        /// The stack's default Availability Zone, which must be in the stack's region. For more information, see Regions and Endpoints. If you also specify a value for DefaultSubnetId, the subnet must be in the same zone. For more information, see CreateStack.
        public let defaultAvailabilityZone: String?
        /// The ARN of an IAM profile that is the default profile for all of the stack's EC2 instances. For more information about IAM ARNs, see Using Identifiers.
        public let defaultInstanceProfileArn: String?
        /// The stack's operating system, which must be set to one of the following:   A supported Linux operating system: An Amazon Linux version, such as Amazon Linux 2, Amazon Linux 2018.03, Amazon Linux 2017.09, Amazon Linux 2017.03, Amazon Linux 2016.09,  Amazon Linux 2016.03, Amazon Linux 2015.09, or Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 18.04 LTS, Ubuntu 16.04 LTS, Ubuntu 14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7    A supported Windows operating system, such as Microsoft Windows Server 2012 R2 Base, Microsoft Windows Server 2012 R2 with SQL Server Express,  Microsoft Windows Server 2012 R2 with SQL Server Standard, or Microsoft Windows Server 2012 R2 with SQL Server Web.   A custom AMI: Custom. You specify the custom AMI you want to use when you create instances. For more information about how to use custom AMIs with OpsWorks, see Using Custom AMIs.   The default option is the stack's current operating system. Not all operating systems are supported with all versions of Chef. For more information about supported operating systems, see OpsWorks Stacks Operating Systems.
        public let defaultOs: String?
        /// The default root device type. This value is used by default for all instances in the stack, but you can override it when you create an instance. For more information, see Storage for the Root Device.
        public let defaultRootDeviceType: RootDeviceType?
        /// A default Amazon EC2 key-pair name. The default value is none. If you specify a key-pair name, OpsWorks Stacks installs the public key on the instance and you can use the private key with an SSH client to log in to the instance. For more information, see  Using SSH to Communicate with an Instance and  Managing SSH Access. You can override this setting by specifying a different key pair, or no key pair, when you  create an instance.
        public let defaultSshKeyName: String?
        /// The stack's default VPC subnet ID. This parameter is required if you specify a value for the VpcId parameter. All instances are launched into this subnet unless you specify otherwise when you create the instance. If you also specify a value for DefaultAvailabilityZone, the subnet must be in that zone. For information on default values and when this parameter is required, see the VpcId parameter description.
        public let defaultSubnetId: String?
        /// The stack's new host name theme, with spaces replaced by underscores. The theme is used to generate host names for the stack's instances. By default, HostnameTheme is set to Layer_Dependent, which creates host names by appending integers to  the layer's short name. The other themes are:    Baked_Goods     Clouds     Europe_Cities     Fruits     Greek_Deities_and_Titans     Legendary_creatures_from_Japan     Planets_and_Moons     Roman_Deities     Scottish_Islands     US_Cities     Wild_Cats    To obtain a generated host name, call GetHostNameSuggestion, which returns a host name based on the current theme.
        public let hostnameTheme: String?
        /// The stack's new name. Stack names can be a maximum of 64 characters.
        public let name: String?
        /// Do not use this parameter. You cannot update a stack's service role.
        public let serviceRoleArn: String?
        /// The stack ID.
        public let stackId: String
        /// Whether the stack uses custom cookbooks.
        public let useCustomCookbooks: Bool?
        /// Whether to associate the OpsWorks Stacks built-in security groups with the stack's layers. OpsWorks Stacks provides a standard set of built-in security groups, one for each layer, which are associated with layers by default. UseOpsworksSecurityGroups allows you to provide your own custom security groups instead of using the built-in groups. UseOpsworksSecurityGroups has the following settings:    True - OpsWorks Stacks automatically associates the appropriate built-in security group with each  layer (default setting). You can associate additional security groups with a layer after you create it, but you cannot  delete the built-in security group.   False - OpsWorks Stacks does not associate built-in security groups with layers. You must create  appropriate EC2 security groups and associate a security group with each layer that you create. However, you can still  manually associate a built-in security group with a layer on. Custom security groups are required only for those layers  that need custom settings.   For more information, see Create a New Stack.
        public let useOpsworksSecurityGroups: Bool?

        @inlinable
        public init(agentVersion: String? = nil, attributes: [StackAttributesKeys: String]? = nil, chefConfiguration: ChefConfiguration? = nil, configurationManager: StackConfigurationManager? = nil, customCookbooksSource: Source? = nil, customJson: String? = nil, defaultAvailabilityZone: String? = nil, defaultInstanceProfileArn: String? = nil, defaultOs: String? = nil, defaultRootDeviceType: RootDeviceType? = nil, defaultSshKeyName: String? = nil, defaultSubnetId: String? = nil, hostnameTheme: String? = nil, name: String? = nil, serviceRoleArn: String? = nil, stackId: String, useCustomCookbooks: Bool? = nil, useOpsworksSecurityGroups: Bool? = nil) {
            self.agentVersion = agentVersion
            self.attributes = attributes
            self.chefConfiguration = chefConfiguration
            self.configurationManager = configurationManager
            self.customCookbooksSource = customCookbooksSource
            self.customJson = customJson
            self.defaultAvailabilityZone = defaultAvailabilityZone
            self.defaultInstanceProfileArn = defaultInstanceProfileArn
            self.defaultOs = defaultOs
            self.defaultRootDeviceType = defaultRootDeviceType
            self.defaultSshKeyName = defaultSshKeyName
            self.defaultSubnetId = defaultSubnetId
            self.hostnameTheme = hostnameTheme
            self.name = name
            self.serviceRoleArn = serviceRoleArn
            self.stackId = stackId
            self.useCustomCookbooks = useCustomCookbooks
            self.useOpsworksSecurityGroups = useOpsworksSecurityGroups
        }

        private enum CodingKeys: String, CodingKey {
            case agentVersion = "AgentVersion"
            case attributes = "Attributes"
            case chefConfiguration = "ChefConfiguration"
            case configurationManager = "ConfigurationManager"
            case customCookbooksSource = "CustomCookbooksSource"
            case customJson = "CustomJson"
            case defaultAvailabilityZone = "DefaultAvailabilityZone"
            case defaultInstanceProfileArn = "DefaultInstanceProfileArn"
            case defaultOs = "DefaultOs"
            case defaultRootDeviceType = "DefaultRootDeviceType"
            case defaultSshKeyName = "DefaultSshKeyName"
            case defaultSubnetId = "DefaultSubnetId"
            case hostnameTheme = "HostnameTheme"
            case name = "Name"
            case serviceRoleArn = "ServiceRoleArn"
            case stackId = "StackId"
            case useCustomCookbooks = "UseCustomCookbooks"
            case useOpsworksSecurityGroups = "UseOpsworksSecurityGroups"
        }
    }

    public struct UpdateUserProfileRequest: AWSEncodableShape {
        /// Whether users can specify their own SSH public key through the My Settings page. For more information, see Managing User Permissions.
        public let allowSelfManagement: Bool?
        /// The user IAM ARN. This can also be a federated user's ARN.
        public let iamUserArn: String
        /// The user's new SSH public key.
        public let sshPublicKey: String?
        /// The user's SSH user name. The allowable characters are [a-z], [A-Z], [0-9], '-', and '_'. If the specified name includes other punctuation marks, OpsWorks Stacks removes them. For example, my.name will be changed to myname. If you do not specify an SSH user name, OpsWorks Stacks generates one from the IAM user name.
        public let sshUsername: String?

        @inlinable
        public init(allowSelfManagement: Bool? = nil, iamUserArn: String, sshPublicKey: String? = nil, sshUsername: String? = nil) {
            self.allowSelfManagement = allowSelfManagement
            self.iamUserArn = iamUserArn
            self.sshPublicKey = sshPublicKey
            self.sshUsername = sshUsername
        }

        private enum CodingKeys: String, CodingKey {
            case allowSelfManagement = "AllowSelfManagement"
            case iamUserArn = "IamUserArn"
            case sshPublicKey = "SshPublicKey"
            case sshUsername = "SshUsername"
        }
    }

    public struct UpdateVolumeRequest: AWSEncodableShape {
        /// The new mount point.
        public let mountPoint: String?
        /// The new name. Volume names can be a maximum of 128 characters.
        public let name: String?
        /// The volume ID.
        public let volumeId: String

        @inlinable
        public init(mountPoint: String? = nil, name: String? = nil, volumeId: String) {
            self.mountPoint = mountPoint
            self.name = name
            self.volumeId = volumeId
        }

        private enum CodingKeys: String, CodingKey {
            case mountPoint = "MountPoint"
            case name = "Name"
            case volumeId = "VolumeId"
        }
    }

    public struct UserProfile: AWSDecodableShape {
        /// Whether users can specify their own SSH public key through the My Settings page. For more information, see Managing User Permissions.
        public let allowSelfManagement: Bool?
        /// The user's IAM ARN.
        public let iamUserArn: String?
        /// The user's name.
        public let name: String?
        /// The user's SSH public key.
        public let sshPublicKey: String?
        /// The user's SSH user name.
        public let sshUsername: String?

        @inlinable
        public init(allowSelfManagement: Bool? = nil, iamUserArn: String? = nil, name: String? = nil, sshPublicKey: String? = nil, sshUsername: String? = nil) {
            self.allowSelfManagement = allowSelfManagement
            self.iamUserArn = iamUserArn
            self.name = name
            self.sshPublicKey = sshPublicKey
            self.sshUsername = sshUsername
        }

        private enum CodingKeys: String, CodingKey {
            case allowSelfManagement = "AllowSelfManagement"
            case iamUserArn = "IamUserArn"
            case name = "Name"
            case sshPublicKey = "SshPublicKey"
            case sshUsername = "SshUsername"
        }
    }

    public struct Volume: AWSDecodableShape {
        /// The volume Availability Zone. For more information, see Regions and Endpoints.
        public let availabilityZone: String?
        /// The device name.
        public let device: String?
        /// The Amazon EC2 volume ID.
        public let ec2VolumeId: String?
        /// Specifies whether an Amazon EBS volume is encrypted. For more information,  see Amazon EBS Encryption.
        public let encrypted: Bool?
        /// The instance ID.
        public let instanceId: String?
        /// For PIOPS volumes, the IOPS per disk.
        public let iops: Int?
        /// The volume mount point. For example, "/mnt/disk1".
        public let mountPoint: String?
        /// The volume name. Volume names are a maximum of 128 characters.
        public let name: String?
        /// The RAID array ID.
        public let raidArrayId: String?
        /// The Amazon Web Services Region. For more information about Amazon Web Services Regions, see  Regions and Endpoints.
        public let region: String?
        /// The volume size.
        public let size: Int?
        /// The value returned by DescribeVolumes.
        public let status: String?
        /// The volume ID.
        public let volumeId: String?
        /// The volume type. For more information, see  Amazon EBS Volume Types.    standard - Magnetic. Magnetic volumes must have a minimum size of 1 GiB and a maximum size of 1024 GiB.    io1 - Provisioned IOPS (SSD). PIOPS volumes must have a minimum size of 4 GiB and a maximum size of 16384 GiB.    gp2 - General Purpose (SSD). General purpose volumes must have a minimum size of 1 GiB and a maximum size  of 16384 GiB.    st1 - Throughput Optimized hard disk drive (HDD). Throughput optimized HDD volumes must have a  minimum size of 125 GiB and a maximum size of 16384 GiB.    sc1 - Cold HDD. Cold HDD volumes must have a minimum size of 125 GiB and a maximum size of 16384 GiB.
        public let volumeType: String?

        @inlinable
        public init(availabilityZone: String? = nil, device: String? = nil, ec2VolumeId: String? = nil, encrypted: Bool? = nil, instanceId: String? = nil, iops: Int? = nil, mountPoint: String? = nil, name: String? = nil, raidArrayId: String? = nil, region: String? = nil, size: Int? = nil, status: String? = nil, volumeId: String? = nil, volumeType: String? = nil) {
            self.availabilityZone = availabilityZone
            self.device = device
            self.ec2VolumeId = ec2VolumeId
            self.encrypted = encrypted
            self.instanceId = instanceId
            self.iops = iops
            self.mountPoint = mountPoint
            self.name = name
            self.raidArrayId = raidArrayId
            self.region = region
            self.size = size
            self.status = status
            self.volumeId = volumeId
            self.volumeType = volumeType
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case device = "Device"
            case ec2VolumeId = "Ec2VolumeId"
            case encrypted = "Encrypted"
            case instanceId = "InstanceId"
            case iops = "Iops"
            case mountPoint = "MountPoint"
            case name = "Name"
            case raidArrayId = "RaidArrayId"
            case region = "Region"
            case size = "Size"
            case status = "Status"
            case volumeId = "VolumeId"
            case volumeType = "VolumeType"
        }
    }

    public struct VolumeConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// Specifies whether an Amazon EBS volume is encrypted. For more information,  see Amazon EBS Encryption.
        public let encrypted: Bool?
        /// For PIOPS volumes, the IOPS per disk.
        public let iops: Int?
        /// The volume mount point. For example "/dev/sdh".
        public let mountPoint: String
        /// The number of disks in the volume.
        public let numberOfDisks: Int
        /// The volume RAID level.
        public let raidLevel: Int?
        /// The volume size.
        public let size: Int
        /// The volume type. For more information, see  Amazon EBS Volume Types.    standard - Magnetic. Magnetic volumes must have a minimum size of 1 GiB and a maximum size of 1024 GiB.    io1 - Provisioned IOPS (SSD). PIOPS volumes must have a minimum size of 4 GiB and a maximum size of 16384 GiB.    gp2 - General Purpose (SSD). General purpose volumes must have a minimum size of 1 GiB and a maximum size  of 16384 GiB.    st1 - Throughput Optimized hard disk drive (HDD). Throughput optimized HDD volumes must have a  minimum size of 125 GiB and a maximum size of 16384 GiB.    sc1 - Cold HDD. Cold HDD volumes must have a minimum size of 125 GiB and a maximum size of 16384 GiB.
        public let volumeType: String?

        @inlinable
        public init(encrypted: Bool? = nil, iops: Int? = nil, mountPoint: String, numberOfDisks: Int, raidLevel: Int? = nil, size: Int, volumeType: String? = nil) {
            self.encrypted = encrypted
            self.iops = iops
            self.mountPoint = mountPoint
            self.numberOfDisks = numberOfDisks
            self.raidLevel = raidLevel
            self.size = size
            self.volumeType = volumeType
        }

        private enum CodingKeys: String, CodingKey {
            case encrypted = "Encrypted"
            case iops = "Iops"
            case mountPoint = "MountPoint"
            case numberOfDisks = "NumberOfDisks"
            case raidLevel = "RaidLevel"
            case size = "Size"
            case volumeType = "VolumeType"
        }
    }

    public struct WeeklyAutoScalingSchedule: AWSEncodableShape & AWSDecodableShape {
        /// The schedule for Friday.
        public let friday: [String: String]?
        /// The schedule for Monday.
        public let monday: [String: String]?
        /// The schedule for Saturday.
        public let saturday: [String: String]?
        /// The schedule for Sunday.
        public let sunday: [String: String]?
        /// The schedule for Thursday.
        public let thursday: [String: String]?
        /// The schedule for Tuesday.
        public let tuesday: [String: String]?
        /// The schedule for Wednesday.
        public let wednesday: [String: String]?

        @inlinable
        public init(friday: [String: String]? = nil, monday: [String: String]? = nil, saturday: [String: String]? = nil, sunday: [String: String]? = nil, thursday: [String: String]? = nil, tuesday: [String: String]? = nil, wednesday: [String: String]? = nil) {
            self.friday = friday
            self.monday = monday
            self.saturday = saturday
            self.sunday = sunday
            self.thursday = thursday
            self.tuesday = tuesday
            self.wednesday = wednesday
        }

        private enum CodingKeys: String, CodingKey {
            case friday = "Friday"
            case monday = "Monday"
            case saturday = "Saturday"
            case sunday = "Sunday"
            case thursday = "Thursday"
            case tuesday = "Tuesday"
            case wednesday = "Wednesday"
        }
    }
}

// MARK: - Errors

/// Error enum for OpsWorks
public struct OpsWorksErrorType: AWSErrorType {
    enum Code: String {
        case resourceNotFoundException = "ResourceNotFoundException"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize OpsWorks
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// Indicates that a resource was not found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// Indicates that a request was not valid.
    public static var validationException: Self { .init(.validationException) }
}

extension OpsWorksErrorType: Equatable {
    public static func == (lhs: OpsWorksErrorType, rhs: OpsWorksErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension OpsWorksErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
